Javascript: Object or Object.prototype?

Javascript: Object or Object.prototype?

本文关键字:Object prototype or Javascript      更新时间:2023-09-26

我刚刚学习了Javascript中的原型(不是框架,而是原生特性)。我至少完全掌握了它的一种用法。例子:

Array.prototype.myMethod = function(){
   /*do something super awesome*/
}
var a = [];
a.myMethod();

继续读下去,我遇到了一个例子,作者在对象对象中添加了子类方法,方法如下:

Object.subClass = function(hash){/*return an extended object that inherits Object's attributes*/}

目标是创建一个类似于面向对象语言语法的方法。因为我期望书的作者使用原型特性来定义这样的方法,所以我的问题是:

  • 为什么不使用prototype?
  • 直接将方法添加到对象而不是将原型附加到对象上不是更有风险吗?
  • 在某些情况下我更喜欢一种方式而不是另一种方式

为什么不使用prototype?

因为如果使用了prototype,那么subClass方法只在Object的实例上可用。例如,要调用subClass,必须使用以下命令:

Object.prototype.subClass = function(hash) { /* return an extended object that inherits Object's attributes */ };
function MyClass() { };
var myInstance = new MyClass();
var mySubClassInstance = myInstance.subClass(); // only accessible on instances

这没有多大意义,因为作者希望subClass返回对象的扩展实例。目的不是创建父"类"的实例,然后从该实例返回一个新的子实例。这是不必要的。

通过在Object上定义它,可以在不首先创建MyClass实例的情况下创建subClass实例:

Object.subClass = function(hash) { /* return an extended object that inherits Object's attributes */ };
function MyClass() { };
var mySubClassInstance = MyClass.subClass();

直接向对象添加方法不是比将原型附加到对象上更有风险吗?在某些情况下,我是否更喜欢其中一种方式?

  • Add to prototype向该对象的实例添加成员。
  • Add to the object向该对象添加成员(类似于静态成员的思想)。

如果您希望方法能够访问类实例(使用this关键字),请使用prototype。如果您不需要this,则将function声明为类本身的成员,这样您就可以在没有对象的情况下调用它。