gpt4 book ai didi

javascript - Crockford 原型(prototype)继承的小缺点

转载 作者:数据小太阳 更新时间:2023-10-29 04:07:28 24 4
gpt4 key购买 nike

只是在 JS 中尝试不同的继承技术,并且发现了一些关于 Crockford 的原型(prototype)继承模式的稍微令人不安的事情:

function object(o) {
function F() {}
F.prototype = o;
return new F();
}

var C,
P = {
foo:'bar',
baz: function(){ alert("bang"); }
}

C = object(P);

一切都很好 - 除了当你登录到控制台时 - 对象显示为 F。我见过经典的仿真,你可以在其中重新指向构造函数 - 是否有类似的方法来强制对象(控制台)引用?

最佳答案

问题是它指的是构造函数的 name。这很快就变成了关于函数表达式和语句以及名称属性的讨论。事实证明,不使用 eval 是完全不可能在运行时创建新命名函数的。名称只能使用函数语句 function fnName(){} 指定,并且除了评估之外不可能动态构造该代码块。 var fnExpression = function(){} 生成一个分配给变量的匿名函数。函数的 name 属性是不可变的,所以这是一个既定的交易。使用 Function("arg1", "arg2", "return 'fn body';") 也只能产生一个匿名函数,尽管类似于 eval。

这基本上只是 JS 规范中的一个疏忽(Brendan Eich 表示他后悔以他 10 年前左右的方式定义显示名称)并且正在讨论 ES6 的解决方案。这将引入更多语义来为调试工具导出函数的显示名称,或者可能是一种设置和调整它的显式方法。

现在您有一条路线:eval,或其他形式的可配置代码的延迟执行。 (以任何其他名称评估...)

function displayName(name, o){
var F = eval("1&&function "+name+"(){}");
F.prototype = o;
return new F;
}

单独的函数语句不会从 eval 返回,但是执行 1 && fnStatement 会将事情强制转换为可返回的表达式。

(Harmony Proxies 还允许设置报告名称的函数,您可以在没有 eval 的情况下配置这些名称,但目前除了 Node.js 和 Firefox 之外不可用)。

我会在这里做一个说明,所有那些被 Crockford 和许多其他人所抨击的“邪恶”功能都有它们的位置。 evalwith、extending natives 都启用了特定的技术,否则这些技术是完全不可能的,在适当的时候使用它们并没有错。很可能大多数人都没有资格判断什么时候是对的。在我看来,在等待解决方案时使用 eval 无害地弥补糟糕的语言语义和工具是完全可以接受的,只要您不将任意代码注入(inject)其中,就不会对您造成任何伤害评估声明。

关于javascript - Crockford 原型(prototype)继承的小缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com