在OOP

2014-02-16 22 views
1

在JavaScript中使用「this.prototype」與外「Constructor.prototype」,限定了classlike(構造)功能的方法,通常進行這樣的:在OOP

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

而由一般語法去/ ECMAScript中的語義規則,沒有理由我不能重寫/修改/與

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

那爲什麼不能那麼做延續原來的Object.prototype?代碼看起來會更混亂一些,但是寫和讀更快更清晰(將Class1相關的所有方法置於Class1本身之下)。這不是更好的用途嗎?

+2

您的第二個示例代碼將不起作用。構造函數內的'this'的值是* not *構造函數;這是新創建的對象的值。 – Pointy

+0

然後我可以通過'this.constructor'訪問它嗎?我不妨編輯一下我的問題。 – gchiconi

+0

構造函數針對* every *對象實例化運行。每當您創建一個新對象時,您都會爲原型添加一組相同的函數,這會對性能產生巨大影響。 – meagar

回答

2

那兩個代碼最肯定是不是一樣;第二個將不起作用。

構造函數中會發生什麼(通常)與原型對象無關。它是每個實例的初始化代碼。感興趣的「原型」屬性是構造函數的「原型」屬性,而不是實例。

在構造函數中創建原型函數沒有任何意義,因爲這意味着您將爲每個創建的實例重新執行該工作。

+0

對,我猜我現在明白了。謝謝! – gchiconi

2

問題是這兩個代碼示例不等效。在第一個例子中,'this'引用了Class1,但在第二個例子中'this'引用了新創建的對象。例如,

var myObj = new Class1() 

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

另外,即使這樣做確實有效,您仍然可以爲您創建的每個實例重新創建該方法。不這樣做會更有效率。

1

正如其他答案指出的那樣,原型的第二次使用不是一個有效的JavaScript代碼,但它似乎想要在實際運行時訪問您的構造函數,這可以通過以下兩個選項來實現:

1,如果你不使用嚴格模式,你可以把它想:

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

在例如嚴格模式2 - 如果你有一個像你classlike功能:

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

這樣你只能在構造函數中使用ClassConstructor,它在那裏是私有的。

1

即使您修復了代碼,指向正確的this,原型屬性也會在創建時添加到每個實例中。

但它們是通過共享方法/屬性的相同副本來添加的。

如果不叫原型:如果有人稱其爲「鮑勃」和手抄的,它會更有意義:

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,每次你創建一個新的人。