我想知道,如果有一种本机的做法:
Object.prototype.chain = function(f) { return f.call(this) } function fun1() { doSomethingWithObject(this) return this } function fun2() { doSomethingElse(this) return this } someObject .method1('something') .method2() .chain(checkSomething() ? fun1 : fun2) .method3()
但是我不想改变Object的原型.有没有办法这样做,而不修改对象或其他构造函数的原型,我使用(而不是开发人员)
编辑:
我觉得我的解释不好,所以让我们加一些细节:
我想做的是使用一些我没有定义的API. someObject被定义如下,具有可链接的方法:
var someObject = { method1: function(val) { // do something return this },method2: function() { // do something return this },method3: function() { // do something return this } }
现在想象我不能改变这个代码,因为这个对象是从一个库,所以我不想.然后,想象我想链接方法和一些自定义函数(请参阅我的第一个代码段)为更多的不同的对象.最简单的做法是将一个链接方法附加到Object.prototype.
但我认为这可能会导致未来的冲突.我正在寻找一种方式来做同样的事情,而不用触摸原型.
解决方法
包装器将包装任何对象以使其与“链接”兼容,并将添加另一种链接方法,这将允许您插入外部函数并仍然获取链接.
检查这个例子:
function myObj() { this.state = { a: 1 }; this.method1 = function () { console.log("1"); } this.method2 = function () { console.log("2"); } this.method3 = function () { console.log("3"); } this.method4 = function () { console.log(this.state); } } function objectChainWrapper(obj) { this.chain = function (fn) { fn.call(obj); return this; } for (var prop in obj) { if (obj.hasOwnProperty(prop) && typeof obj[prop] == 'function') { this[prop] = (function (methodName) { return function () { obj[methodName].call(obj); return this; } }(prop)) } } } var obj = new myObj(); var wrapper = new objectChainWrapper(obj); var chainMethod = function(){ console.log('chain') }; var chainMethodState = function(){ console.log(this.state) }; wrapper.method1().method2().chain(chainMethodState).method3().chain(chainMethod).method4();