日期:2014-05-16  浏览次数:20380 次

JavaScript大牛们,路过请进。有2个JS很核心的问题要提问下。

JavaScript大牛们,路过请进。有2个JS很核心的问题要提问下。

?

1.请问constructor1.prototype = constructor2.prototype和constructor1.prototype = new constructor2() 的区别

【备注】constructor1和constructor2分别指2个我自己创建的构造函数。如下:

????????????function Person(){ /*coding...*/}

????????????function Man(){ /*coding*/}

????????????Man.prototype = Person.prototype和Man.prototype = new Person()的区别?

?

2.请问JavaScript中子类继承父类时,是将父类里面的方法定义实实在在的拷贝到自己的类定义中吗?我的意思就是问,比如上面的Person中定义了一个公有的方法(可以被继承),那么Man继承了Person后,在Man的类定义中有Person中那个公有方法的定义还是只是一个方法的引用呢???

?

这2个问题困恼了我很久,请神人们赐教。

?

?

?

?

?

1 楼 argont 2011-04-03  
首先:a.prototype = b.prototype 是指a继承了b的公用方法,而且是方法的引用。一旦b.prototype.xxx 发生了改变,a.prototype.xxx也会一起发生改变。如下代码可以证明:
function classA() {
	this.name = 'my name is a';
	this.age = 30;
}
classA.prototype.getAge = function() { return this.age; }
classA.prototype.getName = function() { return this.name; }
classA.prototype.setAge = function(v) { this.age = v; }
classA.prototype.setName = function(v) { this.name = v; }

function classB() {
	this.name = 'my name is b';
	this.age = 20;
}

classB.prototype = classA.prototype;

var a = new classA();
var b = new classB();

classA.prototype.getAge = function() { return "I'm " + this.age + " years old."; }

alert ( a.getAge() );
alert ( b.getAge() );


第二:a.prototype = new b() 是指a继承了b的所有方法和属性,如下代码可以证明:
[code='javascript']
function classA() {
	this.name = 'my name is a';
	this.age = 30;
}
classA.prototype.getAge = function() { return this.age; }
classA.prototype.getName = function() { return this.name; }
classA.prototype.setAge = function(v) { this.age = v; }
classA.prototype.setName = function(v) { this.name = v; }

function classB() {}

classB.prototype = new classA();

var a = new classA();
var b = new classB();

classA.prototype.getAge = function() { return "I'm " + this.age + " years old."; }

alert ( a.getAge() );
alert ( b.getAge() );
2 楼 bantouyan 2011-04-05  
第一个问题:
    Man.prototype = Person.prototype的含义是类Man与类Person共用同一个原型对象,他们有相同的原型属性,请验证下面的代码:
       Man.prototype = Person.prototype;
       var m = new Man();
       var p = new Person();
       alert(m instanceof Man); //true
       alert(m instanceof Person); //true
       alert(p instanceof Man); //true
       alert(p instanceof Person); //true
可以说Man与Person是同一个类,修改Man的prototype会影响到Person,反之亦然。唯一不同的是用new Man()创建的对象与用new Person()创建的对象可能会有不同的实例属性。

    Man.prototype = new Person()是标准的原型继承方式,Man是Person的子类,拥有Person的一切属性,而且修改Man的prototype不会影响Person,但修改Person的prototype会影响到Man,可以测验下面的代码:
       Man.prototype = new Person();
       var m = new Man();
       var p = new Person();
       alert(m instanceof Man); //true
       alert(m instanceof Person); //true
       alert(p instanceof Man); //false
       alert(p instanceof Person); //true

第二个问题:
     JavaScript中类的所有方法都是对象,类的方法只是对方法对象的一个引用,无论在类Man中还是在Person中,所有的方法都是引用。