原型

prototype

显示原型 / 原型对象

只有 Object 和函数对象中存在*原型对象
*
原型对象是公有的,所有继承的对象都可以访问其中的属性和方法**

构造函数通过*原型对象中的 constructor 方法构造对象实例,对象实例会继承构造方法中的原型对象
*
构造函数的原型对象原型是继承的**原型对象
Object 的*原型对象原型**是 null
**

__proto__

隐式原型 / 原型

所有对象中都存在*原型
*
原型中的属性和方法是对象私有的
*
对象的原型原型继承自其父级的**原型对象
Object 的*原型原型是 Object 的原型对象**

原型图解

prototype 详解

constructor

* 构造函数的原型对象中的构造方法指向构造函数
* Object 的原型对象中的构造方法指向 Object
**

__proto__

*继承的**原型对象

parent.isPrototypeOf(obj)**

**_desc_** 检测是否是原型对象 **params** { object } parent 检测的**原型对象父级对象,不能直接设置 prototype**) **params** { object } obj 检测的对象 **return** { boolean }

  1. var parent = {};
  2. var obj = {};
  3. var bool1 = parent.isPrototypeOf(obj);
  4. console.log(bool1); // false
  5. Object.setPrototypeOf(obj, parent);
  6. var bool2 = parent.isPrototypeOf(obj);
  7. console.log(bool2); // true

obj.toString()**

**_desc_** 转换为字符串 **params** { object } obj **return** { string } 除非重写,否则对象返回 [object Object] 字符串

  1. var num = 100;
  2. var bol = false;
  3. var obj = {};
  4. console.log(num.toString()); // "100"
  5. console.log(bol.toString()); // "false"
  6. console.log(obj.toString()); // "[object Object]"

obj.valueOf()

* 主要用于获取通过对象形式声明的变量的值
* 通过对象形式声明的引入类型,使用 valueOf 无变化
*通过对象形式声明的基本类型,使用 valueOf 会获取字面量形式声明的值**

**_desc_** 获取对象原始值 **params** { object } obj **return** { any }

  1. var num = new Number(100);
  2. var str = new String("Hello World");
  3. var obj = new Object();
  4. console.log(num); // Number {100}
  5. console.log(str); // String {"Hello World"}
  6. console.log(obj); // {}
  7. console.log(num.valueOf()); // 100
  8. console.log(str.valueOf()); // "Hello World"
  9. console.log(obj.valueOf()); // {}

obj.toLocaleString()**

**_desc_** 转换为本地格式的字符串 **params** { object } obj **return** { string } 除非重写,否则对象返回 [object Object] 字符串

  1. var num = 100;
  2. var bol = false;
  3. var obj = {};
  4. console.log(num.toLocaleString()); // "100"
  5. console.log(bol.toLocaleString()); // "false"
  6. console.log(obj.toLocaleString()); // "[object Object]"

**

obj.hasOwnProperty()**

obj.propertyIsEnumerable()

* 上述方法详见 引用类型 - 对象 Object - 类型检测
**

proto 详解

constructor

*继承的原型对象中的构造方法

__proto__

*继承的**原型对象

Object.create(parent, propertyDescriptor)**

**_desc_** 创建对象并指定**原型对象 _`params`_ { object } parent 设置的原型对象父级对象,不能直接设置 prototype _`params`_ { object } propertyDescriptor 属性特征描述 _`return`_ { object } 新的对象**

  1. function Human() {
  2. this.run = function() {
  3. console.log("run");
  4. }
  5. }
  6. var obj = Object.create(new Human(), {
  7. name: {
  8. value: "zhangsan",
  9. writable: true,
  10. enumerable: true,
  11. configurable: true
  12. },
  13. age: {
  14. value: 18,
  15. writable: true,
  16. enumerable: true,
  17. configurable: true
  18. }
  19. });
  20. console.log(obj); // { name: "zhangsan", age: 18 }
  21. obj.run(); // "run"

Object.setPrototypeOf(obj, parent)**

**_desc_** 设置**原型对象**(继承) **params** { object } obj **params** { object } parent 设置的**原型对象父级对象,不能直接设置 prototype**) **return** { object } 原对象

  1. function Human() {
  2. this.run = function() {
  3. console.log("prototype - run");
  4. }
  5. }
  6. Human.eat = function() {
  7. console.log("__proto__ - eat");
  8. }
  9. var obj = {};
  10. var _obj = Object.setPrototypeOf(obj, new Human());
  11. console.log(_obj === obj); // true
  12. obj.run(); // "prototype - run"
  13. obj.eat(); // error: obj.eat is not a function

Object.getPrototypeOf(obj)**

**_desc_** 获取**原型对象 _`params`_ { object } obj _`return`_ { object } **原型对象 prototype

  1. function Human() {}
  2. var human = new Human();
  3. var proto = Object.getPrototypeOf(human);
  4. console.log(proto); // { constructor: Human() }
  5. console.log(proto === Human.prototype); // true

Object.is(value, value)

* 与 === 运算符大体相同,但存在区别:
* === 运算符将 -0 和 +0 视为相等,但 Object.is() 视为不相等
=== 运算符将 NaN 和 NaN 视为不相等,但* Object.is() 视为相等
*
=== 运算符将 Number.NaN 和 NaN 视为不相等,但** Object.is() 视为相等

**_desc_** 判断两个值是否相同 **params** { any } value 比较的值 **return** { boolean }

  1. console.log(-0 === +0); // true
  2. console.log(NaN === NaN); // false
  3. console.log(Number.NaN === NaN); // false
  4. console.log(Object.is(-0, +0)); // false
  5. console.log(Object.is(NaN, NaN)); // true
  6. console.log(Object.is(Number.NaN, NaN)); // true

Object.assign()

* 上述方法详见 引用类型 - 对象 Object - 类型管理
**

Object.keys()

Object.values()

Object.entries()

Object.fromEntries()

Object.getOwnPropertyNames()

Object.getOwnPropertySymbols()

* 上述方法详见 引用类型 - 对象 Object - 枚举遍历

Object.getOwnPropertyDescriptor()

Object.getOwnPropertyDescriptors()

Object.defineProperties()

Object.defineProperty()

Object.preventExtensions()

Object.freeze()

Object.seal()

* 上述方法详见 引用类型 - 对象 Object - 属性特征
**

Object.isExtensible()

Object.isFrozen()

Object.isSealed()

* 上述方法详见 引用类型 - 对象 Object - 属性检测

继承

原型链继承

借用构造函数继承

组合式继承

原型式继承

寄生式继承

寄生组合式继承