Javascript:Object还是Object.prototype?

时间:2015-07-07 17:55:55

标签: javascript object prototype

我刚学会了Javascript中的原型(不是框架,原生功能)。我完全得到了,至少有一个用途。例如:

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

阅读我的一个例子,作者在 对象 对象中添加 subClass 方法,通过这样做:

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

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

  • 为什么不使用原型
  • 将方法直接添加到对象而不是附加到它的原型是不是更危险?
  • 是否存在我更喜欢单向
  • 的情况

2 个答案:

答案 0 :(得分:3)

  

为什么不使用原型?

因为如果使用原型,那么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上正确定义,可以在不首先创建subClass的实例的情况下创建MyClass实例:

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

var mySubClassInstance = MyClass.subClass();
  

将方法直接添加到对象而不是附加到它的原型上会有更大的风险吗?   是否存在我更喜欢单向另一种方式的情况。

  • 添加到原型以将成员添加到该对象的实例。
  • 添加到对象以向该对象添加成员(类似于静态成员的想法)。

答案 1 :(得分:1)

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