Javascript 如何正确扩展Obect.prototype?
我正在编写一个JavaScript库,它提供函数Javascript 如何正确扩展Obect.prototype?,javascript,prototype-programming,Javascript,Prototype Programming,我正在编写一个JavaScript库,它提供函数tablify(任何内容),它能够将任何数组或对象表示为HTML表 现在我尝试扩展数组和对象原型,以便像这样使用它: var arr = ["a", "b", "c"]; var obj = {"A": "a", "B": "b", "C": "c"}; arr.tablify(); obj.tablify(); 这是我的方法: Array.prototype.tablify = function() { return tablify(t
tablify(任何内容)代码>,它能够将任何数组或对象表示为HTML表
现在我尝试扩展数组和对象原型,以便像这样使用它:
var arr = ["a", "b", "c"];
var obj = {"A": "a", "B": "b", "C": "c"};
arr.tablify();
obj.tablify();
这是我的方法:
Array.prototype.tablify = function() {
return tablify(this);
}
Object.defineProperty(Object.prototype, 'tablify', {
value: function () {
return tablify(this);
},
writable: true,
configurable: true,
enumerable: false
});
问题是,JavaScript中的所有内容都是对象,因此不仅像{a:1,b:2}
这样的文本可以转换,其他所有内容也可以转换
这没什么大不了的,因为我的tablify()
也可以处理基本类型,但是当我扩展Object.prototype时,typeof anything
总是返回“Object”
,我无法再区分类型:
function tablify(object) {
if (object instanceof Array) {
return ArrayToTable(object);
}
//This is always true if I extend Object.prototype:
if (typeof object === "object") { //only for "normal" objects like "{a: 1, b: 2, c: [],...}"
return ObjectToTable(object);
}
return PrimitiveToTable(object); //strings, numbers, functions, ...
}
- 为什么
typeof
总是返回“对象”
- JS-API提供这种功能(使用“.tablify();”扩展数组/对象)是件好事吗
- 如何区分“正常”对象、数字、函数等李>
- 是否可以仅扩展“正常”对象?
(禁止
(42).tablify();
,字符串.tablify();
。)
- 那些“普通”对象的名称是什么?我该怎么称呼他们
问题是,一旦您在原型上使用了新添加的方法,原始原语值就已经被转换了。例如:
"foo".tablify();
在该调用中,在调用函数之前,字符串原语将转换为字符串实例。换句话说,它的行为就好像你写过:
new String("foo").tablify();
我想您可以使用Object.prototype.toString
函数来区分:
function tablify(obj) {
if (typeof obj === "object") {
var sig = {}.toString.call(obj);
if (/ (String|Number|Boolean)\]$/.test(sig)) {
// treat as primitive
}
else {
// object
}
}
// ...
}
您无法判断装箱原语是否是隐式创建的,但这可能与您的代码的功能无关
为什么typeof
总是返回“对象”
因为在sloppy模式下,始终应该是一个对象。当调用函数或传递undefined或null时,将获得全局对象,当调用方法时,上下文将转换为对象
用于您的tablify
方法,它将起作用
JS-API提供这种功能(使用.tablify();
扩展数组/对象)是件好事吗
。当你想分享你的脚本时,很多人会皱眉不愿意使用它。有关详细讨论,请参阅
至少你有-但我建议在数组上使用它们。prototype
也一样,太多人滥用进行in
枚举
如何区分“正常”对象、数字、函数等
typeof
看起来不错
是否可以仅扩展“正常”对象?(禁止(42).tablify();,“字符串”.tablify();…)
不是真的。所有原语包装器都继承自Object.prototype
那些“普通”对象的名称是什么?我该怎么称呼他们
只是“物体”。或者,如果您愿意,可以使用“普通对象”(将它们与数组、内置对象、主机对象区分开来)。从对象创建HTML的函数听起来不像您通常希望添加到本机对象原型中的东西?并非“JavaScript中的所有内容都是对象”。字符串、数字和布尔不是对象。在被调用的情况下,它们的行为确实像对象,因为语言会隐式地将它们转换为相应的对象类型。@Pointy当我使用代码时,42.tablify()代码>,“字符串”.tablify()代码>,函数表()代码>也在工作,尽管我只扩展了Object.prototype。typeof
还返回“object”
如果(object.prototype.toString.call(object)===“[object object]”)
re:edit:use42..tablify()
(第一个点被解析为小数点)或(42).tablify()
。谢谢,这真的很有用。我使用严格模式使它工作,不过我将删除该功能,因为它的优势是最小的。