1

在尝试了 js 的原型继承之后,我发现我并不热衷于在对象之外声明对象的方法:

function obj(){
  this.averyday='i\'m shuffle\'n';
  this.gibmo='dinero';
  this.pullOut='that\'s what she said lol';
}

obj.prototype.alertProp=function(){
    alert(this.averyday);
}
obj.prototype.alertProp2=function(){
    alert(this.gibmo);
}

所以我想出了一种方法来将我的方法组织到一个命名空间中

obj.prototype.m={
    //i'm passing in the object instance so the mathods can have access to it's properties
    alertProp:function(that){
          alert(that.theObj.everyday);
    },
    alertProp2:function(that){
          alert(that.myObj.gibmo+' '+that.myObj.someVal); // alerts "dinero some other value to be use "
    }
} 
var myobj = new obj;

然后使用我只需调用方法并传入对象实例(如果方法需要修改对象的属性)

myobj.m.alertProp({theObj:myobj,someVal:'some other value to be use'}) //alerts "i'm shuffle'n"

所以这里有一些我注意到的优点:

优点:

1) 将方法组织到一个集中区域。

2) 只访问一次对象的“原型”(实际上使用更少的代码)。

3)似乎更具可读性(至少对我来说)。

缺点:...这是我需要你们帮助的地方,有人认为这样做有什么问题吗?我概述的专业人士有任何性能问题或任何问题等......?

还有人看到我可能没有看到或不明显的任何其他优点吗?

4

1 回答 1

1

我觉得它有点复杂,这就是我喜欢这样做的方式:

MyObject = function (options) {
   this.init(options);
};

MyObject.prototype = {
  /**
   * Documentation
   */
  variable1: null,

  init: function (options) {
    // do something with options.
  },

  alertVariable: function () {
    alert(this.variable1);
  }
};

所以你不必担心发送额外的参数,你只需调用它。

- - - - - - - - - - - - - - 编辑 - - - - - - - - - - - ------------

好吧,我不知道我是否做对了,但经过一番阅读,我相信这将是“修复构造函数”的意思。如果我创建这样的对象:

Foo = function () {
  // Do something
};

然后Foo.prototype.constructor == Foo,正如人们所期望的那样。我的方法的问题(感谢 Raynos)是当我这样做时:

Foo.prototype = {...};

我正在覆盖 Foo 的所有原型,所以,Foo.property.constructor != Foo这不是我们所期望的!取而代之的是,我们有那个Foo.property.constructor == Object.prototype.constructor

那么,我们如何修复它呢?

Foo.prototype = {
  constructor: Foo, // <-- FIXED!
  ...
};

达达!

(这很有帮助:http ://beej.us/blog/data/javascript-prototypes-inheritance/ )

于 2012-04-12T20:53:51.123 回答