js里面constructor __proto__ prototype这三个属性比较难理解,在重点研究这三个属性后,在这里做一个笔记,
constructor:构造器,每个对象都有这个属性,他指向构造该对象的构造函数,我们可以通过对象.constructor获取到其构造函数,
__proto__ :原型机,每一个对象都有这个属性,他指向构造该对象的构造函数的prototype(下面会介绍prototype),如果我们在对象上面找不到某些属性,系统会到__proto__ 所指向的构造函数的prorotype里面去找:
假如说 有一个函数:function Person(){};当我们新建一个Person对象的实例的时候:var p = new Person();我们实际上是执行:var p = {};p.__proto__ = Person.prototype;Person.call(p);
prototype:原型,雏形,蓝本,执行函数才有这个属性,至于这个属性的用法:
伪代码:
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
所以我们实际上是创建了一个对象,他的__proto__指向fn.prototype,然后fn.apply执行fn函数的时候 把函数内部的this指向deriv对象,这样我们实际上初始化函数实例的时候,函数实例的__proto__指向的是函数的prototype,这就可以达到共用属性和继承的目的
对于new 操作的做了什么应该是很好的帮助我们理解__proto__
function test(){}
var tt = new test()
实际上执行的是:
var obj = new Object();
obj.__proto__ = test.prototype;//对象的__proto__指向了方法的prototype
var result = test.call(obj,arguments);
if(typeof(result) == "object"){
return result;
}
return obj;