- 论坛徽章:
- 2
|
要是在使用方式上允许一个间接层就好办了。。。
比如继承的properties是直接访问,但不直接调用:
- function Type () {}
- Type.prototype = {a : 1 , b : 2}
- var p = new Type;
- var q = new Type;
- p.f = function(x) { return x+1; }
- q.f = function(x) { return x-1; }
复制代码 p.a, p.b, q.a, q.b 是可以感知到 Type.prototype 的改动的 —— Type.prototype.a = 12; p.a === 12; ——这是你想要的吧?
又或者直接调用,但不直接访问:
- var p = function(x) { return x+1;}
- var q = function(x) { return x-1; }
- var properties = { a : 1 , b : 2 }
- p.ps = properties
- q.ps = properties
复制代码 如果又要直接调用,且直接访问。。。 不好办啊。。。
1. 让object可以被call
有些object是可以的,但貌似不将这种能力公开给程序员。。。 而且这种特性以后也要删除。。。
- var r = new Type;
- r.call = function(x) { return x+1; }
- r(12) // 如果r(x) 是 r.call(window, 12) 的语法糖什么的就好了, 可惜不是
复制代码 2. 让function可以继承属性
官方的继承属性的方式, new F(args...) 创建出的object继承F.prototype, Object.create(prototype) 都是针对object的。
其实, constructor function可以return一个东西, 而不是隐式返回。
我试过:
- function Type(f) { return function() { return f.apply(this, arguments) } }
- var p = new Type(function(x) { x+1; }
复制代码 但如果使用return, new Type(...) 得到确实是return的东西, 但继承Type.prototype的依然constructor调用时的this。。。
因为return了一个function, 那个object继承了Type.prototype, 但立马被丢弃了。。。
3. 被function继承的prototype
就是Function.prototype了。。。
Function.prototype.a = 1
Function.prototype.b = 2
var f = function(x) { ... }
这改动的范围也太大了。。。
这样应该是可以的:
var properties = inherited(Function.prototype, { a : 1, b : 2} ) ; // 我忘记这函数怎么实现了。。。
var old = Function.prototype
Function.prototype = properties
var f = function(x) { ... }
Function.prototype = old
...
Function.prototype = properties
var g = function(x) { ... }
Function.prototype = old
甚至还想过:
(function() { var Function = { prototype : { a : 1 , b : 2} }; return function(x) { return x+1; } })()
4. 直接修改继承链。。。
var f = function(x) { ... }
f.__proto__ = Type.prototype
但至少IE6不支持__proto__的。。。
总之,木有一个让人各方面都感到满意的方法。。。 |
|