浏览 570 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-11-14 关键字: javascript
以下引用Lich_Ray发表在<无类语言的OOP(JavaScript描述)> http://www.javaeye.com/topic/89554的代码:
<script>
function Light (light) {
this.light = light ? light : 0
this.state = false
this.turnOn = function () {
this.state = true
}
}
Light.prototype.turnOff = function () {
this.state = false
}
function PhilipLight (price) {
this.price = price
}
myLight = new PhilipLight(12);
alert(PhilipLight.prototype.isPrototypeOf(myLight)); //true
Object.prototype.extend = function(aClass) {
this.prototype = new aClass();
}
PhilipLight.extend(Light);
alert(PhilipLight.prototype.isPrototypeOf(myLight)); //false 那么现在myLight的prototype是...?
</script>
感谢知情人提供线索``` (_ _)rz 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-11-14
简单,构造函数实例化对象隐式继承的原形对象是引用,而实例化后,再改变原构造函数的prototype自然导致新的prototype对象引用和原来的不一样,你可以这样
var temp=PhilipLight.prototype; PhilipLight.extend(Light); alert(PhilipLight.prototype.isPrototypeOf(myLight)); //false 那么现在myLight的prototype是...? alert(temp.isPrototypeOf(myLight)) 或者再实例化一便 myLight = new PhilipLight(12); alert(PhilipLight.prototype.isPrototypeOf(myLight)); //true 就正确了,这个就是原形继承prototype对象引用的特点,引用这个东西很奇怪,可以同时有好几个变量指向一个引用,一个也许变成其他引用了,但是没有改变的,确实还没有变化,另外一句,array object都是引用,.push了对象,所有引用都变化,对象也是,但是函数比较特殊,就和字符串一样,函数只要声明后就不能改变内部的语句了,这个比较特殊 |
|
| 返回顶楼 | |
|
时间:2007-11-14
一旦再次声明,指针就都变新的了,可以参见
>>> function a(){alert(123)}
>>> c=a
a()
>>> c()
>>> function a(){alert(234)}
>>> c()
>>> c.toString()
"function a() { alert(123); }"
>>> a.toString()
"function a() { alert(234); }"
|
|
| 返回顶楼 | |
|
时间:2007-11-14
afcn0 写道 一旦再次声明,指针就都变新的了,可以参见
>>> function a(){alert(123)}
>>> c=a
a()
>>> c()
>>> function a(){alert(234)}
>>> c()
>>> c.toString()
"function a() { alert(123); }"
>>> a.toString()
"function a() { alert(234); }"
function a被声明了2次,c只要HOLD a 的REFERENCE,都应该指向最后一次声明的为准. functions应该比其他STATEMENTS先被INTERPRET. |
|
| 返回顶楼 | |
|
时间:2007-11-15
那不一定,中间如果eval再次声明,而前次函数引用又有变量保存,那前后的函数就都会存在
function a(){
alert(123)
}
c=a;
eval("function a(){alert(234)}");
c();
a();
和
function a(){
alert(123)
}
c=a;
function a(){
alert(234)
}
c();
a();
可是不一样的 |
|
| 返回顶楼 | |
|
时间:2007-11-15
afcn0 写道 那不一定,中间如果eval再次声明,而前次函数引用又有变量保存,那前后的函数就都会存在
function a(){
alert(123)
}
c=a;
eval("function a(){alert(234)}");
c();
a();
和
function a(){
alert(123)
}
c=a;
function a(){
alert(234)
}
c();
a();
可是不一样的 eval应该是另外的一个CASE,尽管它可以去执行JAVASCRIPT STATEMENTS,可是我理解它依然应该在用"function"声明的FUNCTION后被INTERPRET. 我是这样理解的: 上面第2个例子中,当C=A的时候,C应该就是HOLD第2次声明的A FUNCTION. 所以无论怎样,C都从来没有指向过第1次声明的A FUNCTION. 第1个例子中, 当C=A的时候,确实C是HOLD第1次声明的A FUNCTION,因为JAVASCRIPT只是先INTEPRET第一个A FUNCTION, 而EVAL作为一个一般的JAVASDRIPT STATEMENT,还没有被INTERPRET到,所以当EVAL被EXECUTE后,A FUNCTION才确实变了,但是之前存过的VAR C不会变... 所以我的观点就是JAVASCRIPT在执行CODE之前,需要一个预编译过程, 首先应该就是FUNCTION(用function声明的),变量声明,之后是ASSIGNMENT...... 为了论证这一点,我又参照了一下 OREILLY 的书在THE DEFINITIVE GUIDE中,在SECTION 6.14中作者阐述了这样一个观点: "Technically speaking, the function statement is not a statement. Statements cause dynamic behavior in a JavaScript program, while function definitions describe the static structure of a program. Statements are executed at runtime, but functions are defined when JavaScript code is parsed, or compiled, before it is actually run. When the JavaScript parser encounters a function definition, it parses and stores (without executing) the statements that comprise the body of the function." |
|
| 返回顶楼 | |
|
时间:2007-11-15
没有那么复杂,function确实是预处理,如果同时声明两次,当然以后一次为准,但是如果2次声明不是同时进行,前次函数引用被获得,那第2次函数声明不会继续使用原来函数对象所使用的引用,其实这就出现了一个非常有趣的东西,2个叫同名函数的函数同时出现,注意这不是重载,函数名在js当中不重要,只是起到一个toString的名字,函数是一等对象,名字比较无所谓,和lambda什么的匿名函数都是一样的
|
|
| 返回顶楼 | |
|
时间:2007-11-15
感谢楼上二位的讨论 使我又明白一些有关函数的知识
只是我想知道在PhilipLight.extend(Light);之后,myLight对象的内部机制是怎么样的 |
|
| 返回顶楼 | |
|
时间:2007-11-15
一点变化都没有,就是原来哪个样子
|
|
| 返回顶楼 | |
|
时间:2007-11-15
在PhilipLight.extend(Light)之后,alert(myLight.state==undefined)时显示true,可以说明myLight的原型PhilipLight.prototype也没有改变,因为按这篇(http://msdn.microsoft.com/msdnmag/issues/07/05/JavaScript/default.aspx?loc=zh)的说法,当myLight不存在state属性时,会检查其原型是否具有该属性,见图http://msdn.microsoft.com/msdnmag/issues/07/05/JavaScript/zh/fig06_L.gif .
那么,只有在PhilipLight被再次实例化后它才会改变,是这样吗? |
|
| 返回顶楼 | |



