prototype 是函数有的属性;
__proto__是每个对象都有的一个属性;
一 prototype
是函数特有的属性(除了一些内建的函数),只有函数才有。
它含有特定类型的所有实例共享的属性和方法。
prototype是通过调用构造函数而创建的那个对象实例的原型对象;
当你创建函数时,JS会为这个函数自动添加prototype属性,值是空对象 值是一个有 constructor 属性的对象,不是空对象。而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数的实例,实例继承构造函数prototype的所有属性和方法(实例通过设置自己的__proto__指向承构造函数的prototype来实现这种继承
1.hasOwnProperty 和 in hasOwnProperty:可判断是否为自有属性; in: 可判断自有属性和原型属性;
const obj = {a: 1};
obj.hasOwnProperty("a"); // true
obj.hasOwnProperty("toString"); // false
"a" in obj; // true
"toString" in obj; // true
复制代码
则可以判断是否为原型属性:key in obj && !obj.hasOwnProperty(key);
二 __proto__
引用《JavaScript权威指南》的一段描述:
Every JavaScript object has a second JavaScript object (or null , but this is rare) associated with it. This second object is known as a prototype, and the first object inherits properties from the prototype.
对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。
function ConstructorFn() {};
const tempOjb = {a: 1};
ConstructorFn.prototype = tempOjb;
const instanceObj = new ConstructorFn();
console.log(instanceObj.__proto__ === ConstructorFn.prototype) // true;
console.log(instanceObj.__proto__ === tempOjb) // true;
console.log(Object.getPrototypeOf(instanceObj) === instanceObj.__proto__) // true
复制代码
原型链图
1.Function.prototype和Function.__proto__都指向Function.prototype
2.Object.prototype.proto === null,说明原型链到Object.prototype终止。