我有这段代码:
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()
答案 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 () { }