批量创建对象的方法

时间:2016-07-07 18:43:26

标签: javascript object prototype

我知道对象的新方法可以这样声明:

var MyObject = function() {return new MyObject.prototype};
MyObject.prototype.exists = function() {alert("The object exists.")};

如何为MyObject创建多个方法而不是一个一个?

我试过

MyObject.prototype = {
    exists: function() {alert("The object exists.")},
    isBorn: function() {alert("The object is born.")},
    isDead: function() {alert("The object has left our world.")}
}

致电MyObject.exists()返回:Uncaught TypeError: MyObject.exists is not a function


我想做什么

我正在尝试像jQuery那样做。

jQuery的定义如下:

jQuery = function(selector, context) {included)
    return new jQuery.fn.init(selector, context);
}

当我们将其称为var j = new jQuery;时,我们不会说jQuery("#foo")

然后文件说:

jQuery.fn = jQuery.prototype = {
    jquery: version,
    constructor: jQuery,
    length: 0,

    toArray: function() {
        return slice.call( this );
    }
    ...
}

toArray()对象的方法不是jQuery吗?我打电话时为什么不显示相同的错误。

3 个答案:

答案 0 :(得分:1)

调用jQuery函数时,您未创建jQuery的实例,这就是您不使用new关键字的原因。相反,您要返回jQuery.fn.init实例

跟着它,你会看到init的原型被声明:

init.prototype = jQuery.fn;

jQuery.fn的定义是:

jQuery.fn = jQuery.prototype = { ... };

这意味着(new jQuery.fn.init(selector, context))拥有jQuery.prototype的所有方法。

因此,toArray不是jQuery对象的方法,而是调用jQuery()的返回值原型的方法。

通过手动分配返回值的原型,您可以通过更少的步骤实现相同的目标。

function MyObject() {
  var obj = {};
  return Object.setPrototypeOf(obj, MyObject.prototype);
}

MyObject.prototype.toArray = function() {};

MyObject().toArray();

答案 1 :(得分:0)

你非常接近,你只需创建一个对象的新实例,让它继承自己的原型链。

;

答案 2 :(得分:0)

第一个仍然更好,因为原型对象具有预定义的属性(目前只有<xsl:template match="link/@href"> <xsl:attribute name="id"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> ,但后来标准可以扩展),完全覆盖原型对象将有效地删除这些属性。但它仍然可以缩短为:

&#13;
&#13;
constructor
&#13;
&#13;
&#13;

但是,嘿,这是2016年!我们在大多数主流浏览器中都有javascript类(check compatibility at MDN)!

&#13;
&#13;
function Foo() {}
const p = Foo.prototype;
console.log(Object.getOwnPropertyNames(p));
p.exists = function() { console.log("exists"); };
p.isBorn = function() { console.log("isBorn"); };

(new Foo).exists();
&#13;
&#13;
&#13;