• 如果所有对象都有私有字段 [[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