- 如果所有对象都有私有字段 [[prototype]],就对象的原型
- 读一个属性,如果对象本身没有,则会继续访问对象的原型,直到原型为空为止
从 ES6 以来,JavaScript 提供了一系列内置函数来操控原型
- Object.create 根据指定的原型创建新对象,原型可以使null;
- Object.setPrototypeOf 设置一个对象的原型;
利用这三个方法,我们可以完全抛开类的思维,利用原型来实现抽象和复用
create方法
var cat = {
say(){
console.log("meow~");
},
jump(){
console.log("jump");
}
}
var tiger = Object.create(cat, { //基于猫对象创建了一个虎对象,并进行了一些修改
say:{
writable:true,
configurable:true,
enumerable:true,
value:function(){
console.log("roar!");
}
}
})
var anotherCat = Object.create(cat);//依据cat创建一个新对象(继承cat的所有属性)
anotherCat.say(); //meow~
var anotherTiger = Object.create(tiger);
anotherTiger.say(); //rora!
anotherTiger.jump(); //jump
Object.setPrototypeOf方法
var cat = {
say(){
console.log("meow~");
},
jump(){
console.log("jump");
}
}
var tiger = {}
Object.setPrototypeOf(tiger , cat )
//设置tiger的原型是cat,tiger对象可以访问cat的所有属性(属性和方法)。
/* Object.setPrototypeOf(object, prototype)返回的是参数对象本身 所以上边两句也可以写成 var tiger = Object.setPrototypeOf({}, cat ) 结果是一样的 */
cat.say() //meow~
tiger.say() //meow~
tiger.jump() //jump