在JavaScript中,定义类(构造函数)函数方法通常是这样完成的:
function Class1() {
// ... code ...
}
Class1.prototype.method1 = function(args) {
// ... code ...
};
按照ECMAScript的一般语法/语义规则,我没有理由不能用
覆盖/修改/扩展原始的Object.prototypefunction Class1() {
// ... code ...
this.prototype.method1 = function(args) {
// ... code ...
};
}
那为什么不这样做呢?代码看起来会更混乱,但编写和读取更快更清晰(将所有与Class1相关的方法放在Class1本身下面)。这不是更好的用途吗?
答案 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。