原型继承理解

时间:2013-10-27 19:54:58

标签: javascript

我有这段代码:

var Class = function(){ // function constructor
this.className = 'Class';
}
Class.prototype.method = function(){ // open method
alert('method of ' + this.className);
}

var ClassSub = function(){ // function constructor of sub class
this.className = 'ClassSub';
}
ClassSub.prototype = new Class(); 

var objSub = new ClassSub(); 
objSub.method(); 

我有一个问题:Class.prototype.method = function(){ // open method

当我们这样写的时候,我们说我们班级的原型会有这个方法。 所以他的子类将有这个方法。 但我无法理解的是 为什么我们不能只写

Class.method = function()

2 个答案:

答案 0 :(得分:1)

Class.method = function () {};

这只会在构造函数method上添加Class属性。函数是对象,可以像任何其他对象一样保存数据。但是,不会将method函数添加到Class实例的原因很简单:这不是JavaScript中实现原型继承的方式

您应该阅读What is the 'new' keyword in JavaScript?,您将了解原型链的设置方式以及为什么向构造函数添加成员不会影响使用此构造函数创建的实例。

我认为值得一提的是ClassSub.prototype = new Class();不是设置原型链的有效方法,因为它将运行Class构造函数的代码。

在现代浏览器中,您只需使用Object.create,旧版浏览器就有垫片。

ClassSub.prototype = Object.create(Class.prototype);

答案 1 :(得分:0)

正如评论中所述,Class.method变量 Class创建了一个属性。而不是Class实例

var Class = function () { /* some code */ }
Class.method = function () { }
console.log(Class.method); // function () { }
console.log(new Class().method); // undefined

Class.prototype.method = function () { }
console.log(new Class().method); // function () { }