【发布时间】:2011-10-31 18:54:11
【问题描述】:
如何在不修改原型的情况下扩展核心 JavaScript 类型(字符串、日期等)?例如,假设我想用一些方便的方法创建一个派生字符串类:
function MyString() { }
MyString.prototype = new String();
MyString.prototype.reverse = function() {
return this.split('').reverse().join('');
};
var s = new MyString("Foobar"); // Hmm, where do we use the argument?
s.reverse();
// Chrome - TypeError: String.prototype.toString is not generic
// Firefox - TypeError: String.prototype.toString called on incompatible Object
错误似乎源自 String 基方法,在这种情况下可能是“拆分”,因为它的方法被应用于某些非字符串对象。但是如果我们不能应用到非字符串对象上,那么我们真的可以自动重用它们吗?
[编辑]
显然,我的尝试在很多方面都存在缺陷,但我认为这表明了我的意图。经过一番思考,我们似乎无法重用任何 String 原型对象的函数,除非在 String 上显式调用它们。
是否可以像这样扩展核心类型?
【问题讨论】:
-
只需使用
defineProperty扩展String.prototype并确保将 enumerable 设置为false并配置为true
标签: javascript prototypal-inheritance