ECMAscript是否提供构建函数的任何方法?

时间:2014-12-21 17:00:41

标签: javascript types constructor

据我所知,构造函数无法生成函数:它们可以为this分配属性,并为其他通用属性提供即时prototype引用,因此不是特定于实例的属性。但是直接向this分配任何内容是不可能的。即使它是,但逻辑结果将是用赋值替换实例,以及它的原型链。

根据我读过的ES6类,它们相当于语法糖,用于在单个语句中对构造函数声明和原型实例化进行分组。

我的实际兴趣在于instanceof运算符在断言X符合Y的高阶描述而没有任何鸭子类型时的价值。特别是,鸭子打字是不可取的,因为它依赖于Y本身外部的某种Y定义。

2 个答案:

答案 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

调用的函数中返回 Object
function Foo() {
    // a constructor
}
function Bar() {
    // another constructor
    return new Foo();
}

var b = new Bar();
b instanceof Bar; // false
b instanceof Foo; // true

使用new Function

function Fizz() {
    return new Function('return "Buzz";');
}
var b = Fizz();
b(); // "Buzz"

使用thiscallapply

,使用不同的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