new一个对象的过程 function B(){} var a=new B(); 事实上类似于这个过程function B(){} var a={}; a.__proto__=B.prototype; B.call(a);
function classA(){ this.s = 54654; }; calssA.prototype.s=444; var a = new classA(); document.write(a.s); 1.创建Object 2.查找classA的prototype上的所有方法、属性,复制一份给创建的Object(注意,如果prototype上有属性是function或者数组或者Object,那么只复制指针) 3.将构造函数classA内部的this指向创建的Object 4.执行构造函数classA
function classA(){ this.b=1; } classA.prototype.b=44; var b = new classA(); document.write(b.b + '<--b<br>'); // 上面是用new做到的 function newClass(cls,args){ var obj = {}; for(var p in cls.prototype) obj[p] = cls.prototype[p]; obj.__proto__ = cls.prototype; cls.apply(obj,args||[]); return obj; }; var k = newClass(classA); document.write(k.b + '<--k<br>'); // 上面是用函数做到的
不是复制。 而是通过__proto__属性来引用。 这就是原型链。 除了IE外,其他浏览器的__proto__属性都是可见的。function B(){} var a=new B(); alert(a.__proto__==B.prototype);如果是复制,上面的代码就不会是true了。
执行对象的初始化方法初始化对象的属性
返回申请的空间的地址
0x0000ffff [ | | | | | | | | | | | | |]类似这样
}
FuckYou.prototype =object_test = {
name:"John",
sex:'male',
getName:function(){
return this.name;
}
}
var fuckyou = new FuckYou();
function subFuck(){
this.sex ='subFemale';
//FuckYou.call(this);
subFuck.prototype =fuckyou;
}
subFuck.prototype =fuckyou;
var subObject = new subFuck();
alert(subObject.getName());
alert(subFuck.prototype==FuckYou.prototype);
function B(){}
var a=new B();
事实上类似于这个过程function B(){}
var a={};
a.__proto__=B.prototype;
B.call(a);
this.s = 54654;
};
calssA.prototype.s=444;
var a = new classA();
document.write(a.s);
1.创建Object
2.查找classA的prototype上的所有方法、属性,复制一份给创建的Object(注意,如果prototype上有属性是function或者数组或者Object,那么只复制指针)
3.将构造函数classA内部的this指向创建的Object
4.执行构造函数classA
function classA(){
this.b=1;
}
classA.prototype.b=44;
var b = new classA();
document.write(b.b + '<--b<br>');
// 上面是用new做到的
function newClass(cls,args){
var obj = {};
for(var p in cls.prototype)
obj[p] = cls.prototype[p];
obj.__proto__ = cls.prototype;
cls.apply(obj,args||[]);
return obj;
};
var k = newClass(classA);
document.write(k.b + '<--k<br>');
// 上面是用函数做到的
而是通过__proto__属性来引用。
这就是原型链。
除了IE外,其他浏览器的__proto__属性都是可见的。function B(){}
var a=new B();
alert(a.__proto__==B.prototype);如果是复制,上面的代码就不会是true了。
我们可以轻松的通过__proto__和构造函数的prototype指向同一对象可以确定,但是各个浏览器实现方式不同,是否是通过__proto__实现不可确定。
至于IE,应该也是类似的,只是可能实现方式有稍微的不同。
鉴于IE在JS方面的落后,可以认为__proto__就是实现原型链的普遍方法。
__proto__可以用来暴露新对象是根据哪个prototype创建而来,但不代表一定是new实现的时候用__proto__作为模板的。
__proto__的作用是用来给开发者确定它是根据哪个prototype创建而来(好像我在重复..),指向的是对象的构造函数的prototype,仅此而已。
至于你所谓的浏览器的__proto__可以访问作为证据,显然是站不住脚的。
我甚至可以自己实现一个__protoABCD__也指向那个prototype,是否证明我内部实现的时候用的__protoABCD__做模板的?
不可否认的是__proto__指向构造函数的prototype,constructor指向构造函数(貌似我上面实现的那个函数忘记实现constructor了),但是并不代表浏览器内部创造对象的时候是引用__proto__或者constructor作为模板或者构造对象的,尽管他们的指针指向都相同。
因为对于浏览器来说,多写一个方法没有必要。var a={}
var B=function(){}
a.__proto__=B.prototype;
alert(a instanceof B);结果是true
你写的什么__protoABCD__可不行的。
你可以看看我的函数里那个var k那个
k instanceof classA 也是true的,朋友。
这又跟浏览器究竟是用prototype作为模板和__proto__作为模板有什么关系?
我只是说无法确定是用__proto__还是用prototype作为模板的。
而用prototype作为模板,也可以给对象添加一个__proto__属性,这在c++级别上不过是添加一个指针指向而已。
话又说回来了,最终结果,prototype与__proto__一定指向同一个对象、同一块内存,您一定要说是用__proto__实现的,这样抬杠有什么意义么?您又不是js内核的实现者怎么就确定它一定是__proto__实现的,没准它起名就叫abcdef回头只是将__proto__指针指向了abcdef指向的对象,这又怎么了?
我们不是js引擎的实现者,无法确定就是无法确定,您怎么就那么确定?您反编译了还是您实现了?就算您实现了,您实现了您的内核,您实现了IE的js引擎了吗?您实现了chrome的js引擎了吗?您实现了opera引擎了吗?对于各大浏览器来说,保持统一的标准是好的事情,具体内部如何实现的,你我都是推测,所以我说不能确定是为了严谨,我不明白您在这里信誓旦旦就是__proto__有什么意义。