使用构造函数添加方法

时间:2014-08-17 21:57:52

标签: javascript prototype

创建构造函数的经典方法如下:

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是构造函数而且它不可能添加方法吗?

3 个答案:

答案 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://jsfiddle.net/kqtm4f8j/

了解原型继承模式的好文章:

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中有很多其他方法可以做到这一点,但理解原型对象是一个很好的起点。