两个对象的原型关系:每个对象都可以把另一个作为它的原型,并继承原型所有的属性。对象通过内部属性[[prototype]](_ _ proto _ _)指定它的原型。以此方式连接成的对象链成为原型链。
let proto = {
age: 25,
describe: function () {
console.log('name: ' + this.name)
}
};
let obj = {
__proto__: proto,
name: 'obj'
};
继承
>obj.describe
[function]
this总是指向开始查找方法时所在对象
覆写
一个原型链中,一个对象可以覆写上一级的相同键的属性,最先访问的是最下级的对象的属性。
通过原型在对象间共享数据
多个对象可以拥有相同的原型,这个原型持有所有的共享属性。
获取和设置原型
我们可以使用读取原型的函数和通过给定的prototype创建新对象的函数。
-使用给定prototype创建新对象
调用方法:
Object.create(proto, proDescObj?)
创建原型为proto的对象的同时,可以选择性的添加描述符属性。
例如:
var proto ={};
var marry = Object.create(proto,{
name:{value:'Marry',writable: true}
});
单一般可以先创建一个空对象,然后手动添加属性,因为描述符比较繁琐。
var proto ={};
var marry = Object.create(proto);
marry.value = 'Marry';
读取对象原型的方法
调用方法:
Object.getPrototypeOf(obj)
返回obj的原型。
检查一个对象是否为另一个对象的原型
调用方法:
Object.prototype.isPrototypeOf(obj)
方法检验接收者是否是obj的原型。
var A = {};
var B = Object.create(A);
var C = Object.create(B);
console.log(A.isPrototypeOf(C)); //true
console.log(B.isPrototypeOf(A)); //false
找到定义属性的对象
特殊属性__proto__
某些JS引擎支持它获取和设置对象,可以直接访问[[Prototype]]
var obj = {};
> obj.__proto === Object.prototype
true
检验是否支持:
Object.getPrototypeOf({ __proto__: null }) === null