论坛首页 Web前端技术论坛

函数与原型对象关系

浏览 5293 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-16   最后修改:2010-12-26
先记录下,慢慢理清,题目不叫什么好?

参考:

http://www.mollypages.org/misc/js.mp
http://blog.morrisjohns.com/illumination_on_javascript_prototypes.html
http://www.planabc.net/2010/05/06/interesting_code_associated_with_function_and_object/

   发表时间:2010-12-21  
这个图是用什么东西画的?挺好看的。我在分析源代码的时候一直想找这么个画图工具来着
0 请登录后投票
   发表时间:2010-12-21  
这个关系是有一些纠结, 我暂且理解为: Function 继承于 Object.

Function.prototype.lori='lori2';
Object.prototype.lori='lori';
function A(){
}
var f = new Function();
var a = new A();
var o = new Object();
console.log(a.lori);
console.log(f.lori);
console.log(o.lori);
delete Function.prototype.lori;
console.log(f.lori);
console.log(o.lori);
0 请登录后投票
   发表时间:2010-12-22  
他们之间关系确实是有些很让人迷糊~
0 请登录后投票
   发表时间:2010-12-22  
__proto__指向的是其构造函数的原型对象.
0 请登录后投票
   发表时间:2010-12-22  
deng131 写道
__proto__指向的是其构造函数的原型对象.

这么说不准确
1. 原型([[prototype]])与prototype属性是两个不同的东西,“原型对象”看起来像是在说内置的原型。
ECMA中为了避免误解,将原型这个内置属性标注为:[[prototype]],以和函数的prototype属性区分开。

2. 改变函数的prototype属性(整个替换:F.prototype={}),并不会影响已构造出的对象。
function F(){};
F.prototype.a=1;
var o = new F();
F.prototype = {a:2};
console.log(o.a); // 1


而F.prototype.a = xxx这样的语句并没有修改F的prototype属性,只是修改prototype属性引用的对象,它与构造出的对象的原型指向同一对象。
function F(){}
var o = new F();
F.prototype.a=1; // F.prototype的a属性被修改
console.log(o.__proto__ === F.prototype); // true
var bak = F.prototype;
F.prototype = {a:2}; // F的prototype属性被修改,已构造出来的o不受影响
console.log(o.__proto__ === bak ); // true
console.log(o.__proto__ === F.prototype); // false


P.S.
需注意一点的是,__proto__这样直接访问对象原型的用法,只能在部分浏览器中使用。
它是非标准的,更多的是用于调试罢了。
所以,实际开发的代码中不应使用它。
1 请登录后投票
   发表时间:2010-12-22  
挺简单的事,这图片给搞复杂了
0 请登录后投票
   发表时间:2010-12-24  
图画的挺好,其实不需要搞这么清楚
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics