1

我有这个代码:

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()
4

2 回答 2

1

Class.method = function () {};

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

您应该阅读什么是 JavaScript 中的“新”关键字?并且您将了解如何设置原型链以及为什么将成员添加到构造函数不会影响使用此构造函数创建的实例。

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

在现代浏览器中,您可以简单地使用Object.create旧浏览器有 shim。

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

于 2013-10-27T20:11:42.497 回答
0

如评论中所述,为变量Class.method创建一个属性。不是. _ _ ClassClass

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 () { }
于 2013-10-27T20:08:58.523 回答