prototype与__proto__

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终止。

转载于:https://juejin.im/post/5b4563dff265da0f7334b1fa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值