【js燃烧吧】js的原型的深入题

##js工程师是不会被原型打败的!!!
prototype和__proto__之前一直困恼了我好久,今天遇到一个原题,把这个知识点搞会,静下心来,感觉又找到斗志了。

function User(){}
User.prototype.sayHello = function(){}
var u1 = new User();
var u2 = new User();
var obj = Object.create(null);
console.log(u1.sayHello === u2.sayHello);
console.log(User.prototype.constructor);
console.log(User.prototype === Function.prototype);
console.log(User.__proto__ === Function.prototype);
console.log(u1.__proto__ === u2.__proto__); 
console.log(u1.__proto__ === User.__proto__);
console.log(Function.__proto__ === Object.__proto__);
console.log(Function.prototype.__proto__ === Object.prototype.__proto__);
console.log(Function.prototype.__proto__ ===Object.prototype);
console.log(obj.prototype == undefined);

看到这题时,是不脑子有点不知所措,这么多问!!!
不要排斥,静下心来,认真读完,你就搞懂了

function User(){}
User.prototype.sayHello = function(){}
var u1 = new User();
var u2 = new User();
var obj = Object.create(null);
console.log(u1.sayHello === u2.sayHello); //true
console.log(User.prototype.constructor);//f Use(){}
console.log(User.prototype === Function.prototype);//false
console.log(User.__proto__ === Function.prototype);//true
console.log(u1.__proto__ === u2.__proto__); //true
console.log(u1.__proto__ === User.__proto__);//false
console.log(Function.__proto__ === Object.__proto__);//true
console.log(Function.prototype.__proto__ === Object.prototype.__proto__);//false
console.log(Function.prototype.__proto__ ===Object.prototype);//false
console.log(obj.prototype == undefined);//true

proto 表原型链上一级的原型
作用:当访问一个对象的属性时,如果该对象内部不存在这个属性,就会去它的__proto__属性所指向的父对象里找,一直找,直到__proto__属性的终点null,
prototype 表该元素的原型
作用:让该函数所实例化的对象们都可以找到公用的属性和方法
首先,我们需要牢记两点:
①__proto__和constructor属性是对象所独有的;
② prototype属性是函数所独有的。
但是由于JS中函数也是一种对象,所以函数也拥有__proto__属性,这点是致使我们产生困惑的很大原因之一。

下面是我个人一些总结,感觉认真读,加上实践和论证,你就搞懂了!
所有函数的__proto__都为function(){native code},因为Function.prototype为function(){native code},其中 Object 也是一个构造函数
基本上所有对象的__proto__为其构造函数的prototype,其中{ }的构造函数为Object,除了Object.create(null);
var obj = Object.create(null);
obj.proto === undefined;
函数的prototype为其自身的原型
对象的prototype都为undefined
基本所有函数的prototype.proto__都为Object.prototype,除了Object.prototype.proto == null
所有对象的prototype.proto,相当于调用undefined的__proto
,因为undefined没有这个属性,会报错
所有函数和基本所有对象的__proto__.prototype都为undefined,因为其相当于其构造函数的prototype.prototype,除了Object.create(null),因为其相当于undefined.prototype

特殊的对象-----不继承Object.prototype
Object.prototype.name = "aa";
var bb = Object.create(null);
console.log(bb.name);  undefined

(可以先看一下最后的总结部分再回过头把原型题目完整看完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳晓黑胡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值