我知道对象的新方法可以这样声明:
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
吗?我打电话时为什么不显示相同的错误。
答案 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>
,但后来标准可以扩展),完全覆盖原型对象将有效地删除这些属性。但它仍然可以缩短为:
constructor
&#13;
但是,嘿,这是2016年!我们在大多数主流浏览器中都有javascript类(check compatibility at MDN)!
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;