说说对原型及原型链的理解
# 是什么
- 原型: proto 所有实例都有
- 原型对象: prototype 构造函数拥有
function doSomething(){}
console.log( doSomething.prototype );
// 输出
{
constructor: ƒ doSomething(),
__proto__: {
constructor: ƒ Object(),
hasOwnProperty: ƒ hasOwnProperty(),
isPrototypeOf: ƒ isPrototypeOf(),
propertyIsEnumerable: ƒ propertyIsEnumerable(),
toLocaleString: ƒ toLocaleString(),
toString: ƒ toString(),
valueOf: ƒ valueOf()
}
}
# 怎么用
通过__proto__链接上一层的prototype
function Person(name) {
this.name = name;
this.age = 18;
this.sayName = function() {
console.log(this.name);
}
}
// 第二步 创建实例
var person = new Person('person')
# 总结
- 所有构造器都是函数对象 constructor
Object.__proto__ === Function.prototype
Object.prototype.__proto__ === null
Function.prototype.__proto__.__proto__ === null
Object.prototype.constructor.__proto__ === Function.prototype
- 一切对象都继承Object对象,Object对象直接继承根对象null
- 一切函数对象(包括Object)都继承自Function对象
- Function对象的__proto__会指向自己的原型对象,最终还好是继承Object对象
var a = 1
// 构造函数Number-prototype
a.__proto__
Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, …}
// 构造函数 Object-prototype
a.__proto__.__proto__
{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}constructor: ƒ Object()hasOwnProperty: ƒ hasOwnProperty()isPrototypeOf: ƒ isPrototypeOf()propertyIsEnumerable: ƒ propertyIsEnumerable()toLocaleString: ƒ toLocaleString()toString: ƒ toString()valueOf: ƒ valueOf()__defineGetter__: ƒ __defineGetter__()__defineSetter__: ƒ __defineSetter__()__lookupGetter__: ƒ __lookupGetter__()__lookupSetter__: ƒ __lookupSetter__()get __proto__: ƒ __proto__()set __proto__: ƒ __proto__()
// null
a.__proto__.__proto__.__proto__
null
上次更新: 2021/12/19, 18:05:42