每个JS意见领袖都说扩展原生对象是一种不好的做法.但为什么?我们是否获得了性能?他们是否害怕有人以"错误的方式"做到这一点,并添加了可枚举的类型Object,几乎破坏了任何对象上的所有循环?
以TJ Holowaychuk的should.js为例.他增加了一个简单的getter来Object,一切工作正常(来源).
Object.defineProperty(Object.prototype, 'should', {
set: function(){},
get: function(){
return new Assertion(Object(this).valueOf());
},
configurable: true
});
Run Code Online (Sandbox Code Playgroud)
这真的很有道理.例如,可以扩展Array.
Array.defineProperty(Array.prototype, "remove", {
set: function(){},
get: function(){
return removeArrayElement.bind(this);
}
});
var arr = [0, 1, 2, 3, 4];
arr.remove(3);
Run Code Online (Sandbox Code Playgroud)
是否有任何反对扩展本机类型的论据?
我扩展了函数原型但是typescript无法识别它.
Function.prototype.proc = function() {
var args, target, v;
var __slice = [].slice;
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
target = this;
while (v = args.shift()) {
target = target(v);
}
return target;
};
// generated by coffee-script
var foo: (number) => (string) => number
= (a) => (b) => a * b.length;
console.log(foo.proc("first", "second"))
Run Code Online (Sandbox Code Playgroud)
结果:tsc -e
The property 'proc' does not exist on value of type 'Function'
Run Code Online (Sandbox Code Playgroud)
我该如何扩展这个对象?
我想扩展方法添加format()到String.所以我的期望是我可以String.format在我的项目中的任何地方使用.我遵循了这个主题的指导方针,但这没有用.我收到了这个错误:

谁能帮我?
提前致谢.
ps:我想像在角度1.xx中那样添加扩展方法
编辑
使用declare global不会得到错误.
declare global {
interface String {
format(): string;
}}
String.prototype.format = function () :string {
var result = arguments[0];
for (var i = 0; i < arguments.length - 1; i++) {
var reg = new RegExp("\\{" + i + "\\}", "gm");
result = result.replace(reg, arguments[i + 1]);
}
return result;}
Run Code Online (Sandbox Code Playgroud)
我们如何使用String.format('<img alt="{0}" title="{0}" src="{1}" />', name, id);
既然format不需要参数
可以说,我想为NgForm添加方法(类)
NgForm.prototype.markAsDirty = function (): void {
let f: NgForm = this;
Util.forEach(f.form.controls, (k, v: AbstractControl) => {
v.markAsDirty(false);
});
};
Run Code Online (Sandbox Code Playgroud)
这在打字稿中是否有可能?
我知道:
但它只适用于接口,而不适用于类.