在OOP中使用“this.prototype”与外部“Constructor.prototype”

时间:2014-02-16 16:06:41

标签: javascript oop syntax prototype

在JavaScript中,定义类(构造函数)函数方法通常是这样完成的:

function Class1() {
   // ... code ...
}
Class1.prototype.method1 = function(args) {
   // ... code ...
};

按照ECMAScript的一般语法/语义规则,我没有理由不能用

覆盖/修改/扩展原始的Object.prototype
function Class1() {
   // ... code ...
   this.prototype.method1 = function(args) {
      // ... code ...
   };
}

那为什么不这样做呢?代码看起来会更混乱,但编写和读取更快更清晰(将所有与Class1相关的方法放在Class1本身下面)。这不是更好的用途吗?

4 个答案:

答案 0 :(得分:2)

问题是这两个代码示例不相等。在第一个例子中,“this”指的是Class1,但在第二个例子中,“this”指的是新创建的对象。例如,

var myObj = new Class1()

在上面的例子中,'this'是myObj - 这打破了你的第二个例子。

此外,即使确实有效,您也可以为每个实例重新创建该方法。不这样做会更有效率。

答案 1 :(得分:2)

这两段代码绝对是相同;第二个不起作用。

构造函数(通常)中发生的事情与原型对象无关。它是每个实例的初始化代码。感兴趣的“原型”属性是构造函数的“原型”属性,而不是实例。

在构造函数中创建原型函数没有意义,因为它意味着你要为你创建的每个实例重新做这项工作。

答案 2 :(得分:1)

正如其他答案所指出的那样,原型的第二次使用并不是一个有效的javascript代码,但似乎你想要在实际运行时访问你的构造函数,这可以通过以下两个选项实现:

1-如果你不使用严格模式,你可以这样:

  var MyClass = function ClassConstructor(){
         arguments.callee.prototype. ...
  }

2-在严格模式下,例如,如果你有类似的类函数,如:

var MyClass = function ClassConstructor(){
        ClassConstructor.prototype. ...
 }

这样你只能在构造函数中使用ClassConstructor,它在那里是私有的。

答案 3 :(得分:1)

即使您修复了代码,指向正确的this,原型属性也会在创建时添加到每个实例中。

但是通过共享方法/属性的相同副本来添加它们。

如果它没有被称为原型:如果它被称为“Bob”并且手工复制,那将更有意义:

var Bob = {
    name : "Bob",
    sayName: function ( ) {
         var person = this;
         console.log( "My name is " + person.name );
    }
};



 var Person = function (name) {
    var person = this;
    person.name = name || Bob.name;
    person.sayName = Bob.sayName;
 };


var doug = new Person("Doug"),
    jim  = new Person("Jim");

幕后有一些事情经常发生,但这里确实没有太大区别,Bob和通常Person.prototype之间的差异。

但是你可以清楚地看到为什么你不想在每次创建新人时重置Bob.name。