Dan*_*idy 17 javascript inheritance
function a () {
return "foo";
}
a.b = function () {
return "bar";
}
function c () { };
c.prototype = a;
var d = new c();
d.b(); // returns "bar"
d(); // throws exception, d is not a function
Run Code Online (Sandbox Code Playgroud)
有没有办法d
成为一个函数,但仍然继承属性a
?
Dan*_*idy 10
实际上,事实证明这是可能的,尽管是以非标准的方式.
Mozilla,Webkit,Blink/V8,Rhino和ActionScript提供了非标准__proto__
属性,允许在创建对象后更改对象的原型.在这些平台上,可以使用以下代码:
function a () {
return "foo";
}
a.b = function () {
return "bar";
}
function c () {
return "hatstand";
}
c.__proto__ = a;
c(); // returns "hatstand"
c.b(); // returns "bar"; inherited from a
Run Code Online (Sandbox Code Playgroud)
这可能对任何不需要担心跨平台兼容性的人都有用.
但请注意,只能继承对象的属性.例如:
var d = {};
d.__proto__ = a;
d.b(); // returns "bar"
d(); // throws exception -- the fact that d is inheriting from a function
// doesn't make d itself a function.
Run Code Online (Sandbox Code Playgroud)
简短的回答:不可能.
这行代码:
var d = new c();
Run Code Online (Sandbox Code Playgroud)
自动假设这d
是一个对象.除非c
是内置对象的构造函数,例如Function
.但是如果c
已经由语言定义,你就无法操纵它的原型,也不能从你喜欢的任何东西"继承"它.好吧,在一些口译员中你可以,但是你不能安全地在所有口译员中做到 - 标准说:"你不会弄乱标准物品,或者翻译会打击你!".
内置对象是"唯一的",JavaScript不提供复制它们的方法.如果不诉诸不兼容的技巧,就无法重新创建字符串,数字,函数等.
基于关于类似问题的元讨论, 我将根据@alexander-mills原件在此处发布此答案
首先创建一个继承的对象 Function
const obj = Object.create(Function.prototype); // Ensures availability of call, apply ext
Run Code Online (Sandbox Code Playgroud)
然后将您的自定义方法和属性添加到 obj
接下来声明函数
const f = function(){
// Hello, World!
};
Run Code Online (Sandbox Code Playgroud)
并设置obj
为原型f
Object.setPrototypeOf(f,obj);
Run Code Online (Sandbox Code Playgroud)
const obj = Object.create(Function.prototype); // Ensures availability of call, apply ext
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2031 次 |
最近记录: |