构造函数外给prototype赋值才能即时绑定? 本帖最后由 u010090753 于 2013-05-03 15:08:05 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 (1)创建一个新的对象,并让 this 指针指向它;(2)将函数的 prototype 对象的所有成员都赋给这个新对象;(3)执行函数体,对这个对象进行初始化操作;(4)返回(1)中创建的对象。new的时候大概执行了上面的那些操作,纯属从别地方抄的,。。不要问我为什么是先2再3,,你的代码已经证明了确实是先2再3.。 prototype本身就是在创建时使用的,而不是在运行的时候调用,当然要用也是可以,只是没有必要如果要在运行的时后新增方法就可以这样:function A() { this.showName = function() { // ... }} 原型链运行机制要理解需要相当的js基础prototype上的成员和构造出的对象上的成员不是一回事对象构造的过程是构造一个新对象并用新对象调用构造函数,但原型链上的成员并没有添加到对象上当访问对象成员时,先从对象自身查找该成员,若无再从其构造函数的prototype属性上查找,若无则查找Object的prototype,若仍然无则为undefined你这儿的问题是第一次构造时把原型链重置了,但该对象的原型对象在构造时已指定,这就造成对象上的原型与该函数当前的原型不是同一个对象,自然找不到新原型链上的成员。第二次调用的话将回复正常修改方法时不要重置对象,只是添加成员而已if(!A._init_) { A.prototype.showName = function(){ return this.name; }}这样就可以了 又是原型的问题..哥只能再次拿出真藏的帖子了..http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html看去吧..讲的很详细..你理解了就明白了你的问题了 关键点:var a = new A(); //a.__proto__ = A.prototype; a.__proto__就是实例的原型.A.prototype = object; //A.prototype变了, a.__proto__却没有重新赋值 第一次的console.log(A.prototype)和console.log(new A().__proto__)都是A{}第二次的才都是被重置后的Object{....}所以一开始A.prototype也没有被重置 跟a.__proto__一样都是没有重新赋值 http://blog.csdn.net/walkingmanc/article/details/6674554按照里面函数对象和普通对象的创建顺序,有点明白。创建函数对象,即function A(){....} 的时候 A.prototype已经默认决定是A{}了然后创建普通对象,即var a=new A()的时候,将A.prototype赋值给a.__proto__,此时a.__proto__也已经决定了是A{},接着初始化A整个函数体的操作会修改到A.prototype,使其变成自定义的Object,但这对前面一开始绑定好的A.prototype和刚刚赋值好的a.__proto__已经不能造成影响(此时的普通对象的本身包括其原型已经不会被重置操作),但是A.prototype仍然在第一个普通对象完成后被修改了,所以之后的每个实例的原型都是自定义Object而直接在原有的原型上添加属性或方法,则是属于晚绑定。结贴 紧急求助!如何更改nicEdit的大小 怎么样动态修改javascript的src属性 一个JS控制问题 【解决马上给分】如果在页面对图片进行放缩,使图片适应指定的大小 如何使用javascript动态创建css的class js 改变文字大小 HTML索引问题?请各位高手赐教!! 那里有下雪的Javascript的特效 请问背景音乐能不能用采用随机播放的方式播放多个背景音乐 怎么调用API?(也许这个问题很简单,但我不会。) 最新版的chrome去除了字体大小的样式?????????? 急 。。js传递参数问题 ,在线等
function A() {
this.showName = function() {
// ...
}
}
prototype上的成员和构造出的对象上的成员不是一回事
对象构造的过程是构造一个新对象并用新对象调用构造函数,但原型链上的成员并没有添加到对象上
当访问对象成员时,先从对象自身查找该成员,若无再从其构造函数的prototype属性上查找,若无则查找Object的prototype,若仍然无则为undefined你这儿的问题是第一次构造时把原型链重置了,但该对象的原型对象在构造时已指定,这就造成对象上的原型与该函数当前的原型不是同一个对象,自然找不到新原型链上的成员。第二次调用的话将回复正常修改方法时不要重置对象,只是添加成员而已if(!A._init_) {
A.prototype.showName = function(){
return this.name;
}
}
这样就可以了
又是原型的问题..哥只能再次拿出真藏的帖子了..
http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html
看去吧..讲的很详细..你理解了就明白了你的问题了
var a = new A(); //a.__proto__ = A.prototype; a.__proto__就是实例的原型.
A.prototype = object; //A.prototype变了, a.__proto__却没有重新赋值
第一次的
console.log(A.prototype)
和console.log(new A().__proto__)
都是A{}
第二次的才都是被重置后的Object{....}所以一开始A.prototype也没有被重置 跟a.__proto__一样都是没有重新赋值