话题源于:
js一个很奇怪的问题
ecma太拙嘴饶舌,本文力图用简单的测试示例来说明问题
任意创建一个函数,其原型prototype立刻被自动创建:
function Coo(){};
alert(Coo.prototype.constructor); //=>function Coo(){}
实例化Coo的原型prototype被置于作用域scope的最顶端:
function Coo(){
alert(Coo.prototype.constructor);
}
var c1 = new Coo(); // => function Coo(){ ..}
在实例化Coo之前修改其原型prototype,其作用域scope顶端自动调整为修改后的原型prototype,并且实例c1可沿原型链找到method方法
function Coo(){
alert(Coo.prototype.method); // => function(){} 作用域scope顶端自动调整为修改后的原型prototyp
}
Coo.prototype = { method : function(){} }
var c1 = new Coo(); // => function(){}
alert(c1.method); // => function(){}
在实例化过程内部重新设置Coo的
属性prototype:
function Coo(){
alert(Coo.prototype.method); // => undefined 作用域scope顶端依旧为默认自动创建的原型prototype
Coo.prototype = { method : function(){} }
//注意:上面这行重新设置了Coo的[b]属性[/b]prototype,
//它已不再是Coo自动创建或是自动调整后的原型prototype了——这正是javascript原型机制的核心
}
var c1 = new Coo(); // => function(){}
//所以,虽然貌似:
alert(c1.prototype.method) // => function(){}
//但此[b]属性[/b]——"prototype"(),已非彼[b]原型[/b]——"prototype"了:
alert(c1.method); // => undefined
所以在实例化过程内部,只能基于
原型prototype来扩展或修改方法
function Coo(){
alert(Coo.prototype.method); // => undefined
Coo.prototype.method = function(){}; // 在正宗原型prototype上扩展,非山寨!
}
var c1 = new Coo(); // => function(){}
alert(c1.prototype.method); // => function(){}
alert(c1.method); // => function(){};
盘根究底,既然在实例化过程内部重新设置Coo的
属性prototype,
那么Coo的
原型prototype又会去了哪儿呢?
function Coo(){
Coo.prototype = { method : function(){ alert("实例化中");} };
};
Coo.prototype = { constructor : Coo, method : function(){} }
var c1 = new Coo();
alert(c1.prototype.method); // => function(){ alert("实例化中");} 糟糕!
alert(c1.method); // => function(){} 谢天谢地!
alert(c1.constructor === Coo ); // => true; 原型链都还在,但它们似乎只是在内部被保存起来了
啰嗦了一大堆,简而言之:
函数的原型prototype是在实例化(或执行函数自身)之前就被自动创建(可以被修改或重置引用)的。
而在实例化(或执行函数自身)过程中,
重置的prototype已沦为一个普普通通的对象属性了,
但是他却并不会干扰正常的javascript实例方法的原型链查找机制。
分享到:
- 2009-08-20 10:48
- 浏览 2473
- 评论(4)
- 论坛回复 / 浏览 (4 / 2833)
- 查看更多
相关推荐
浅析javascript原型继承机制,浅析javascript原型继承机制
javascript原型继承机制参考.pdf
javascript原型继承机制借鉴.pdf
javascript原型继承机制归类.pdf
javascript原型继承机制[整理].pdf
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
浅析Javascript原型继承,浅析Javascript原型继承
JavaSciptDOM基本操作,JavaScipt函数基础,JavaScipt流程语句,JavaScript变量,JavaScript数据类型,JavaScript数组,JavaScript正则表达式,JavaScript字符串函数,Window对象等图解。JS高手进阶的工具图谱
理解Javascript原型继承原理
javascript原型和闭包
javascript原型继承,prototype的使用,可以像java一样继承
Javascript原型继承Javascript原型继承Javascript原型继承
NULL 博文链接:https://ywxowen999.iteye.com/blog/1135884
JavaScript构造函数和原型对象介绍,对于构造函数的创建以及一些简单地介绍,还有就是原型对象对于构造函数的一些补充。
简单谈谈JavaScript寄生式组合继承 组合继承也被称为伪经典继承,它综合了我们昨天说的原型链和盗用构造函数,将俩者的有点结合在了一起。它的基本思想是使用原型链继承原型上的属性和方法,通过盗用构造函数继承...
深度探讨javascript函数的原型链和闭包
构造图集合了BOM、DOM、变量、函数基础、流程语句、数据类型、数组、运算符、正则表达式、字符串函数 比较系统的整理了JavaScript语言
探究JavaScript原型数据共享与方法共享实现 数据共享 需要共享的数据就可以写原型中 原型的作用之一:数据共享 属性需要共享,方法也需要共享: 不需要共享的数据写在构造函数中 需要共享的数据写在原型中 ...
【技术分享】从浅入深 Javascript 原型链与原型链污染 APT web安全 网络安全 安全 自动化
Toast.js:一个JavaScript原型吐司消息Toast messages