关于原型链的文章之前写了一篇 https://cloud.tencent.com/developer/article/1436914
今天想用另一个视角再把原型链理解一遍,主要通过分析对象的__proto__属性和contructor属性反向理解原型链。
我分三层进行分析,第一层分析Object、Object.prototype及 由Object派生的对象实例。
第二层分析自定义构造函数,及该构造函数原型对象,派生对象实例
第三层分析继承型的构造函数,及该构造函数原型对象,派生对象实例
第一层
构造函数Object
__proto__属性 | contructor属性 |
---|---|
无 | 无 |
console.log("Object", Object);
console结果如下:
Object的原型对象Object.prototype
__proto__属性 | contructor属性 |
---|---|
无 | 有 指向构造函数Object Object.prototype.constructor=Object |
console.log("Object.prototype", Object.prototype);
对象实例 new Object()
__proto__属性 | contructor属性 |
---|---|
有 指向原型对象 a.__proto__=Object.prototype 也就是 (new Object).__proto__=Object.prototype | 无 |
var a = new Object();
console.log("a", a);
第二层
自定义构造函数Dog
__proto__属性 | contructor属性 |
---|---|
无 | 无 |
function Dog(name) {
this.name = name;
this.type = 'Dog';
}
console.log("Dog", Dog);
console结果如下:
自定义构造函数Dog的原型对象Dog.prototype
__proto__属性 | contructor属性 |
---|---|
有 不知道指向哪里 猜测是指向到Object原型对象 Dog.prototype.__proto__=Object.prototype ? | 有 指向构造函数Dog Dog.prototype.constructor=Dog |
console.log("Dog.prototype", Dog.prototype);
Dog对象实例 new Dog()
__proto__属性 | contructor属性 |
---|---|
有 指向原型对象 doggie.__proto__=Dog.prototype 也就是 (new Dog).__proto__=Dog.prototype 即 (new Dog).__proto__.__proto__=Object.prototype | 无 |
var doggie = new Dog("wangwang");
console.log("new Dog", doggie);
对于通过对象字面量创建的对象链接到Object.prototype即 通过对象字面量创建的对象.__proto__=Object.prototype 这点和new出来的对象是不同的。
当你创建一个新对象时,你可以选择某个对象最为它的原型。以下代码给Object.create方法创建一个使用对象作为期原型的新对象。
代码语言:javascript复制if (typeof Object.beget !== 'function') {
Object.create = function (o) {
var F = function () {
};
F.prototype = o;
return new F();
};
}
下面给出一个使用的例子
代码语言:javascript复制 var stooge = {
"first-name": "liu",
"last-name": "yi"
};
var another_stooge = Object.create(stooge);
根据观察
stooge.__proto__ === Object.prototype
another_stooge.__proto__ === stooge
another_stooge.__proto__.__proto__ === Object.prototype