##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
(可以先看一下最后的总结部分再回过头把原型题目完整看完)