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