谈谈javascript原型构造机制

话题源于:[url=http://clone168.iteye.com/blog/452290]js一个很奇怪的问题[/url]

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的[b]属性[/b]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


所以在实例化过程内部,只能基于[b]原型[/b]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的[b]属性[/b]prototype,
那么Coo的[b]原型[/b]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是在实例化(或执行函数自身)之前就被自动创建(可以被修改或重置引用)的。
而在实例化(或执行函数自身)过程中,[b]重置[/b]的prototype已沦为一个普普通通的对象属性了,
但是他却并不会干扰正常的javascript实例方法的原型链查找机制。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值