function A(){}
A.prototype.z=8;
function B(){B.prototype=new A();/*2*/}
B.prototype.z=0;//1var createInstance = function(source){
var p = {}
var args = Array.prototype.slice.call(arguments,1);
alert(source.prototype.constructor);//1
p.__proto__ = source.prototype;//1
source.apply(p,args);
alert(source.prototype.constructor);//2
return p;
}var a = createInstance(B);
alert(a.z);//undefined 为什么不是 8 ?
A.prototype.z=8;
function B(){B.prototype=new A();/*2*/}
B.prototype.z=0;//1var createInstance = function(source){
var p = {}
var args = Array.prototype.slice.call(arguments,1);
alert(source.prototype.constructor);//1
p.__proto__ = source.prototype;//1
source.apply(p,args);
alert(source.prototype.constructor);//2
return p;
}var a = createInstance(B);
alert(a.z);//undefined 为什么不是 8 ?
2. 不是8的原因是你把对象p对应的__proto__换成了构造函数B的原型(prototype),而不是构造函数A的原型
你把function B()改为function B(){A.call(this);} 使用call来继承A,就可以正常输出8了
A.prototype.z=8;
b=new A()
alert(b.z)//8
b会 继承原型的属性
-----
function A(){}
A.prototype.z=8;
function B(){B.prototype=new A();/*2*/}
B.prototype.z=0;//1 var createInstance = function(source){
var p = {}
var args = Array.prototype.slice.call(arguments,1);
alert(source.prototype.constructor);//1
p.__proto__ = source.prototype;//1
source.apply(p,args);
alert(source.prototype.constructor);//2
return p;
} var a = createInstance(B);
A的构造函数中没有z属性,但是A的原型属性有z属性,以 A 为原型的 B 的实例 a ,会继承A的原型属性吗?还是只继承它的构造属性?
function A()
{} function B()
{
B.prototype=new A();
} B.prototype.z=0;
var b=new B();
alert(b.constructor);
B.prototype.z=10;
alert(b.z); //0
b=new B();
//B.prototype.z=10;
alert(b.constructor);
alert(b.z); //10 ,这又如何解释?--------
function A()
{} function B()
{
B.prototype=new A();
} B.prototype.z=0;
var b=new B();
alert(b.constructor);
//B.prototype.z=10;
alert(b.z); //0
b=new B();
B.prototype.z=10;
alert(b.constructor);
alert(b.z); //undefined ,这又如何解释?------
js 比静态对象语言更神奇的是,我们可以随时给原型对象动态添加新的属性和方法,从而动态地扩
展基类的功能特性。这在静态对象语言中是很难想象的。我们来看下面的代码:
function Person(name)
{
this.name = name;
};
Person.prototype.SayHello = function() //建立对象前定义的方法
{
alert("Hello, I'm " + this.name);
};
var BillGates = new Person("Bill Gates"); //建立对象
BillGates.SayHello();
Person.prototype.Retire = function() //建立对象后再动态扩展原型的方法
{
alert("Poor " + this.name + ", bye bye!");
};
24
BillGates.Retire(); //动态扩展的方法即可被先前建立的对象立即调用
----李占 < <悟透 JavaScript>>
用new的话,不管是原属性或方法还是prototype加的属性或方法都会应用到. apply只会应用原属性.<script type="text/javascript">
function A(){}
b=new A();
A.prototype.z=8;
alert(b.z) //output 8function B(){A.apply(this);}b=new B();
alert(b.z); //output undefined
</script>
如楼上所说,我试了,原型的附加属性 还是显示不出来:
function A(){}
b=new A();
A.prototype.z=8;
alert(b.z) //output 8 function B(){A.call(this);} b=new B();
alert(b.z); //output undefined
</script>
{} function B()
{
B.prototype=new A();
} B.prototype.z=0;
var b=new B();
alert(b.constructor);
B.prototype.z=10;
alert(b.z);
b=new B(); //这里是再次产生一个新对象 B ,还是对上次产生的对象 B 的引用?
alert(b.constructor);
alert(b.z);//10
function A()
{} function B()
{
B.prototype=new A();
} B.prototype.z=0;
var b=new B();
alert(b.constructor);
B.prototype.z=10;
alert(b.z); //0
b=new B();
alert(b.constructor);
alert(b.z); //10
var p = {}
var args = Array.prototype.slice.call(arguments,1);
alert(source.prototype.constructor);//1
p.__proto__ = source.prototype;//1
source.apply(p,args);
alert(source.prototype.constructor);//2
return p;
} 里面有一个对prototype集合复制的方法,就是__proto__.
但是这个ie不支持.所以在IE的情况下,目标对象的prototype下的方法或属性会全部丢失,也就是你找不到z属性的原因.FF下完全正常.其实你可以对方法做一个改进,因为上面说了apply会放弃prototype下的属性或方法.
var createInstance = function(source){
var p = {}
var args = Array.prototype.slice.call(arguments,1);
if(!document.all){
p.__proto__ = source.prototype;//1
}
else{ //IE
for(var x in source.prototype){
p[t]=source.prototype[t]
}
}
source.apply(p,args);
return p;
} 你试试吧.我都被你的问题弄晕了...
如果你采用你的createInstance方法来创建对象,实际上是将源对象复制了一份.
如果你采用new 方法来创建对象,实际上是对源对象的引用.