一、prototype
prototype
是函数特有的原型对象,原型上的方法和属性会被函数的实例共享(这个时候这个函数应该称为类比较合适了)prototype
都有一个 constructor
属性,指向类的自身
function Animal(){}
Animal.prototype.say = function(){
console.log("hello world")
}
let cat = new Animal();
cat.say();
Animal.prototype.constructor === Animal;
二、__proto__
__proto__
是每个对象都有的隐式原型属性,它指向创建这个对象的类的原型对象(prototype)
- 这个属性是在浏览器支持的,其他运行环境不一定有这个属性(node.js有)
- 操作对象原型上的数据,ES6建议的是使用
Object.setPrototypeOf(o, proto)
和 Object.getPrototypeOf(o)
方法
let o = {};
o.__proto__ === Object.prototype;
function Animal(){};
let cat = new Animal();
cat.__proto__ === Animal.prototype;
Animal.prototype.x = 1;
Object.setPrototypeOf(Animal, {
x: 2
})
console.log(Animal.prototype.x);
console.log(Animal.__proto__.x);
三、一些区分
let o = {};
o.__proto__ === Object.prototype
function Animal(){};
Animal.__proto__ === Function.prototype
let arrowFunc = () => {};
arrowFunc.__proto__ === Function.prototype
arrowFunc.prototype === undefined
Animal.prototype.__proto__ === Object.prototype
Function.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null
Function.__proto__ === Function.prototype
Object.__proto__ === Function.prototype
Symbol.__proto__ === Function.prototype