Javascript:覆盖函数的原型 - 糟糕的做法?

Vit*_*aly 24 javascript constructor prototype

因为当我们声明一个函数时,我们得到它的原型的构造函数属性指向函数本身,如此覆盖函数的原型是一个坏习惯:

function LolCat() {
}

// at this point LolCat.prototype.constructor === LolCat

LolCat.prototype = {
    hello: function () {
        alert('meow!');
    }
    // other method declarations go here as well
};

// But now LolCat.prototype.constructor no longer points to LolCat function itself

var cat = new LolCat();

cat.hello(); // alerts 'meow!', as expected

cat instanceof LolCat // returns true, as expected
Run Code Online (Sandbox Code Playgroud)

这不是我怎么做的,我还是更喜欢以下方法

LolCat.prototype.hello = function () { ... }
Run Code Online (Sandbox Code Playgroud)

但我经常看到其他人这样做.

因为为了方便起见,通过覆盖函数的原型对象,从第一个例子中删除构造函数引用是否有任何影响或缺点?

Rob*_*low 21

就这一点而言,我看不到有人提到最佳实践,所以我认为这取决于你是否能看到该constructor物业有用.

值得注意的一点是constructor,如果您不破坏它,该属性也将在创建的对象上可用.在我看来,这可能是有用的:

var ClassOne = function() {alert("created one");}
var ClassTwo = function() {alert("created two");}

ClassOne.prototype.aProperty = "hello world"; // preserve constructor
ClassTwo.prototype = {aProperty: "hello world"}; // destroy constructor

var objectOne = new ClassOne(); // alerts "created one"
var objectTwo = new ClassTwo(); // alerts "created two"

objectOne.constructor(); // alerts "created one" again
objectTwo.constructor(); // creates and returns an empty object instance
Run Code Online (Sandbox Code Playgroud)

所以在我看来,这是一个架构决策.是否允许创建的对象在实例化后重新调用其构造函数?如果这样保留它.如果没有,请将其销毁.

请注意,objectTwo的构造函数现在完全等于标准的Object构造函数 - 无用.

objectTwo.constructor === Object; // true
Run Code Online (Sandbox Code Playgroud)

所以打电话new objectTwo.constructor()相当于new Object().


Asc*_*iom 5

这不是坏习惯,但你必须知道你在做什么以及为什么.它对原型继承非常有用.您覆盖原型的对象将获得您为其原型分配的对象的所有属性:

您使对象继承使用

ChildClassName.prototype = new ParentClass();.
Run Code Online (Sandbox Code Playgroud)

现在ChildClassName具有ParentClass的所有功能,但丢失之前分配给它的原型的任何功能.您需要记住使用重置对象的构造函数属性

ChildClassName.prototype.constructor=ChildClassName. 
Run Code Online (Sandbox Code Playgroud)

否则,将报告对象(在测试对象的类型时)是ParentClass类型而不是ChildClassName类型.

现在,您可以按照自己描述的方式向ChildClassName对象添加更多方法.

ChildClassName.prototype.myMethod = function(){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

结果是父对象/'类'(当然在javascript中没有真正的类)和从它继承并扩展其功能的子对象/'类'.

您只需要知道,如果您覆盖原型,那么分配给它的任何属性都将消失.构建继承对象时,这可能正是您想要的.