创建构造函数的经典方法如下:
var Obj = function(param){
this.param = param;
this.method = function(){ console.log(this.param); }
}
但为什么我不能这样做:
Obj.anotherMethod = function(){ //some code }
(我知道Obj.prototype.anotherMethod
)。
在实际使用中,我无法理解为什么使用String.prototype.func
代替String.func
来定义新方法。是因为String
是构造函数而且它不可能添加方法吗?
答案 0 :(得分:1)
这些是不同的东西。
如果您向Constructor.prototype
添加方法,则该方法将适用于Constructor
的所有实例。
您还可以向Constructor
本身添加方法。但是,实例不会继承它们。
例如,
charAt
方法在String.prototype
上定义,因此您可以同时使用"abc".charAt(1)
和String.prototype.charAt.call("abc", 1)
。
但fromCharCode
上定义了String
,因此您可以使用String.fromCharCode(65)
,但"abc".fromCharCode
未定义。
答案 1 :(得分:0)
您可以使用原型继承来完成此操作。您可以使用Object.create()
从其他对象继承对象,而不是使用构造函数。您可以随时将成员添加到父对象 ,它们将可用于将父对象作为其原型的对象。
var Base = {a: "a"};
Base.b = "b";
var sub = Object.create(Base); // creates a new object with Base as its prototype
Base.c = "c"; // sub.c will be available because Base is its prototype!
alert(sub.a + sub.b + sub.c); // "abc"
了解原型继承模式的好文章:
http://aaditmshah.github.io/why-prototypal-inheritance-matters/
答案 2 :(得分:0)
这里有一些应该有用的代码。从构造函数开始:
var Obj = function(param){
this.param = param;
this.method = function(){ console.log(this.param); }
}
现在创建一个实例:
var inst = new Obj("testParam")
//now use it
console.log(inst.param) // logs: "testparam
现在向Obj添加另一个参数:
Obj.anotherParam = "TestParam2"
console.log(Obj.anotherParam) // <-- Works
console.log(inst.anotherParam) // <-- but this is Undefined on the instance
但是如果你把它添加到原型中:
Obj.prototype.anotherParam = "TestParam2"
console.log(inst.anotherParam) // <-- this now works as expected
需要注意的是,当您将其添加到原型时,它可供所有实例使用。如果只是将其添加到构造函数中,则只有构造函数具有该参数。在Javascript中有很多其他方法可以做到这一点,但理解原型对象是一个很好的起点。