我正在开发一个涉及从其他函数构造函数的项目。我有编写一个类来简化事情的想法,但如果不求助于使用我就无法让它工作__proto__
.
这基本上就是我的愿景。
function MyFunction () {
// ...
}
var myFn = new MyFunction();
myFn(); // executes without error
myFn instanceof MyFunction; // returns true
下面的代码就是使用__proto__
function MyFunction () {
var fn = function () { return 'hello'; };
fn.__proto__ = this;
return fn;
}
var myFn = new MyFunction();
alert( myFn() ); // hello
alert( myFn instanceof MyFunction ); // true
这是我尝试过使用的东西valueOf
function MyFunction () {
this.fn = function () { return 'hello'; };
this.valueOf = function () { return this.fn; };
}
var myFn = new MyFunction();
alert( myFn instanceof MyFunction ); // true
alert( myFn.valueOf()() ); // hello
alert( myFn() ); // error
这是扩展函数以包含以下所有属性的其他内容MyFunction
.
function MyFunction () {
this.foo = 'hello'
var fn = function () { return 'hello'; };
for ( var i in this ) {
fn[ i ] = this[ i ];
}
return fn;
}
var myFn = new MyFunction();
alert( myFn() ); // hello
alert( myFn.foo ); // hello
alert( myFn instanceof MyFunction ); // false
我不想使用__proto__
因为它是非标准的。另外,这是一个奇怪的想法,我真的很想让它发挥作用,但如果不可能的话我会活下去。但我想我的问题是,我想做的事情可能吗?
令人着迷的想法。我不相信你可以用标准 ECMAScript 来做到这一点,甚至不能使用 ES5。
ES5 使我们能够更好地访问和控制原型,包括提供一种在创建对象时设置原型的方法(无需通过构造函数)Object.create
,但你不能构造功能通过该机制。这就是你必须做的,因为instanceof
使用抽象规范[[HasInstance]]
方法,目前仅通过函数实现,以及它的功能实现 http://ecma-international.org/ecma-262/5.1/#sec-15.3.5.3通过查看对象的底层原型([[Proto]]
) is ===
到函数的prototype
财产。唯一的standard设置对象底层原型的方法是通过以下方式创建它new MyFunction
or via Object.create
,并且两种机制都不会创建函数对象。
ES.next 可能会让这成为可能。有一项提案已被提升为“和谐”状态(因此,相当先进),“设置原型运算符 http://wiki.ecmascript.org/doku.php?id=harmony%3aproto_operator", <|
,旨在解决目前通过__proto__
。它的用途之一是“将函数的原型设置为除Function.prototype
“。使用它(以其当前形式),您的MyFunction
看起来像这样:
function MyFunction () {
return MyFunction.prototype <| function () { return 'hello'; };
}
MyFunction.prototype = Object.create(Function.prototype);
最后一点是为了做到这一点MyFunction.prototype
是一个有原型的对象Function.prototype
,以便通过构造函数MyFunction
have call
, apply
, bind
, etc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)