据我所知,构造函数无法生成函数:它们可以为this
分配属性,并为其他通用属性提供即时prototype
引用,因此不是特定于实例的属性。但是直接向this
分配任何内容是不可能的。即使它是,但逻辑结果将是用赋值替换实例,以及它的原型链。
根据我读过的ES6类,它们相当于语法糖,用于在单个语句中对构造函数声明和原型实例化进行分组。
我的实际兴趣在于instanceof
运算符在断言X符合Y的高阶描述而没有任何鸭子类型时的价值。特别是,鸭子打字是不可取的,因为它依赖于Y本身外部的某种Y定义。
答案 0 :(得分:1)
修改
我对作为其他功能实例的功能感兴趣
在ECMAScript 6中,您应该可以在功能上调用Object.setPrototypeOf
,但不建议使用 JavaScript 一个功能也是一个对象,你最终可能会出现意想不到的行为
function foo() {}
function bar() {}
Object.setPrototypeOf(bar, foo.prototype);
bar instanceof foo; // true
bar.constructor === foo; // true
我不完全确定您的要求,但希望这些代码示例能为您提供帮助
从使用new
function Foo() {
// a constructor
}
function Bar() {
// another constructor
return new Foo();
}
var b = new Bar();
b instanceof Bar; // false
b instanceof Foo; // true
function Fizz() {
return new Function('return "Buzz";');
}
var b = Fizz();
b(); // "Buzz"
使用this
,call
或apply
bind
调用函数
function hello() {
return this;
}
hello(); // window, null or error depending on environment
hello.call({'foo': 'bar'}); // {'foo': 'bar'}
hello.apply({'foo': 'bar'}); // {'foo': 'bar'}
var b = hello.bind({'fizz': 'buzz'});
b(); // {'fizz': 'buzz'}
扩展构造函数
function Foo() {
this.foo = 'foo';
}
Foo.prototype = {'fizz': 'buzz'};
function Bar() {
Foo.call(this);
this.bar = 'bar';
}
// and link in inheritance
Bar.prototype = Object.create(Foo.prototype);
var b = new Bar();
b.bar; // "bar"
b.foo; // "foo"
b.fizz; // "buzz"
b instanceof Bar; // true
b instanceof Foo; // true
// but
Bar instanceof Foo; // false
答案 1 :(得分:0)
构造函数可以构造函数。如果构造函数返回一个对象,则构造函数返回的对象将成为整个new
表达式的结果。
请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
由于函数是对象,您可以从构造函数中返回它们,如下所示:
function Shout(text) {
return function () {
alert(text);
};
}
shout1 = new Shout('hola');
shout2 = new Shout('eeee');
shout1(); // hola
shout2(); // eeee