Javascript ECMAscript是否提供构造函数的方法?
据我所知,构造函数无法生成函数:它们可以将属性分配给Javascript ECMAscript是否提供构造函数的方法?,javascript,types,constructor,Javascript,Types,Constructor,据我所知,构造函数无法生成函数:它们可以将属性分配给this,并立即提供prototype参考,以获得更多通用属性,因此不特定于实例。但是不可能直接给这个分配任何内容。即使是这样,逻辑结果将是用赋值及其原型链替换实例 从我对ES6类的了解来看,它们相当于语法糖,用于在单个语句中对构造函数声明和原型实例化进行分组 我的实际兴趣在于instanceof操作符的值,它断言X符合Y的高阶描述,而不需要任何duck类型。特别是,duck类型是不受欢迎的,因为它依赖于Y本身之外的某种Y定义。Edit 我感兴
this
,并立即提供prototype
参考,以获得更多通用属性,因此不特定于实例。但是不可能直接给这个分配任何内容。即使是这样,逻辑结果将是用赋值及其原型链替换实例
从我对ES6类的了解来看,它们相当于语法糖,用于在单个语句中对构造函数声明和原型实例化进行分组
我的实际兴趣在于instanceof
操作符的值,它断言X符合Y的高阶描述,而不需要任何duck类型。特别是,duck类型是不受欢迎的,因为它依赖于Y本身之外的某种Y定义。Edit
我感兴趣的函数是其他函数的实例
在JavaScript中,您应该能够调用函数,但不建议这样做,尽管在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
使用
通过使用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
构造函数可以构造函数。如果构造函数返回一个对象,则构造函数返回的对象将成为整个new
表达式的结果
看
由于函数是对象,您也可以从构造函数返回它们,如下所示:
function Shout(text) {
return function () {
alert(text);
};
}
shout1 = new Shout('hola');
shout2 = new Shout('eeee');
shout1(); // hola
shout2(); // eeee
这些是关于如何使用new
和this
的简洁示例。我对其他函数的实例很感兴趣,我认为这是不可能的。@Barney不确定这是否有用,但请看一下我的编辑,这非常有用,谢谢!我将玩一玩,试着设置一些测试,以确定我最初追求的是什么,以及它的“建议性”程度……;)保罗,很有魅力。我现在可以键入检查函数(在很少的环境中,而且成本很高)。谢谢@Barney您可能希望将原型设置为Object.create(foo.prototype)
以启用bar
的继承,而不是由foo
继承。另外,instanceof
并不是进行检查的唯一方法,您可以将自己的属性添加到函数中,就像添加任何其他对象一样,而且成本要低得多。(为了解决这个问题,请查看可枚举性;)我认为提问者的问题在于shout1 instanceof Shout;//false
函数确实可以返回函数,但只要调用return
,此就会丢失,并且无法断言shout1
与Shout
有任何关系。在这种情况下使用new
是一种误导,因为Shout
是一种产生任意输出的“工厂”。
function Shout(text) {
return function () {
alert(text);
};
}
shout1 = new Shout('hola');
shout2 = new Shout('eeee');
shout1(); // hola
shout2(); // eeee