Typescript和Javascript ES6之间的比较类构造函数参数,ES.NEXT

Typescript和Javascript ES6之间的比较类构造函数参数,ES.NEXT,javascript,class,typescript,oop,ecmascript-6,Javascript,Class,Typescript,Oop,Ecmascript 6,我一直在学习打字作为Angular2/5的要求,我遇到了一些疑问。 几个月前,我还升级了JSES6等方面的知识。 我很确定我没有错,但是为了完全理解TS,我还是会问你的 这是您可以在此处找到的代码: 在最近的JS更新中,有没有一种方法可以像在TS中那样在类的构造函数中定义属性?w/o通过此实例隐式分配它 在JS中没有任何类似的语法。最简单的方法是使用Object.assign: 课堂测试{ 构造函数{passedVar}{ Object.assignthis,{classAttr:passed

我一直在学习打字作为Angular2/5的要求,我遇到了一些疑问。 几个月前,我还升级了JSES6等方面的知识。 我很确定我没有错,但是为了完全理解TS,我还是会问你的

这是您可以在此处找到的代码:

在最近的JS更新中,有没有一种方法可以像在TS中那样在类的构造函数中定义属性?w/o通过此实例隐式分配它


在JS中没有任何类似的语法。最简单的方法是使用Object.assign:

课堂测试{ 构造函数{passedVar}{ Object.assignthis,{classAttr:passedVar}; } }
console.lognew测试{passedVar:'sweety'}.classAttr 在JS中没有任何类似的语法。最简单的方法是使用Object.assign:

课堂测试{ 构造函数{passedVar}{ Object.assignthis,{classAttr:passedVar}; } }
console.lognew测试{passedVar:'sweety'}.classAttr 我想到了一种非常巧妙的方法,使用自定义代理将对象初始值设定项传递给类。它可能看起来很冗长,但代理可以根据需要重复用于任意多个类定义:

//mem初始值设定项列表 常数列表==>{ 让道具=新的弱贴图 //这个:类实例 //o:初始值设定项对象 函数initializeo={}{ 如果props.hasthis{ 返回这个[props.getthis]=o; } 返回新的代理{ get:o,p=>props.setthis,p,this[p]=o[p] }; } //.call.bind允许初始化此选项,o //传递一个上下文和一个参数 //而不是两个论点 返回initialize.call.bindinitialize; }; //示例用法 课堂测试{ 构造函数o,{classAttr=listthis,'foo',undefinedParameter=listthis,'bar'}=listthis,o{ /* ... */ } } console.lognew测试{classAttr:'sweety',excessParameter:'oops'};
控制台。新测试 我想到了一种非常巧妙的方法,使用自定义代理将对象初始值设定项传递给类。它可能看起来很冗长,但代理可以根据需要重复用于任意多个类定义:

//mem初始值设定项列表 常数列表==>{ 让道具=新的弱贴图 //这个:类实例 //o:初始值设定项对象 函数initializeo={}{ 如果props.hasthis{ 返回这个[props.getthis]=o; } 返回新的代理{ get:o,p=>props.setthis,p,this[p]=o[p] }; } //.call.bind允许初始化此选项,o //传递一个上下文和一个参数 //而不是两个论点 返回initialize.call.bindinitialize; }; //示例用法 课堂测试{ 构造函数o,{classAttr=listthis,'foo',undefinedParameter=listthis,'bar'}=listthis,o{ /* ... */ } } console.lognew测试{classAttr:'sweety',excessParameter:'oops'};
控制台。新测试 ES6类的语法禁止直接在类定义内的原型对象上分配属性

您可以使用getter来实现相同的效果。仅定义getter也将使其成为只读

但是,vanilla javascript中没有隐式语法来处理类型检查,这意味着必须在函数中使用typeof==或instanceof手动完成

使用八达通类将产生以下结果:

class Octopus{
    constructor(classAttr){
        if (typeof classAttr !== 'string' && typeof classAttr !== 'object') { 
            throw new TypeError('classAttr is neither a string nor an object');
        }
        if (typeof classAttr === 'object') {
            Object.assign(this,classAttr);
        }
        else {
            this.classAttr = classAttr;
        }
    }

    //readonly, because there is no setter
    get numberOfLegs(){
        return 8;
    }
}

let octopus = new Octopus('bigEyed');
console.log(octopus.numberOfLegs);     // 8
console.log(octopus.classAttr);        // bigEyed

ES6类的语法禁止直接在类定义内的原型对象上分配属性

您可以使用getter来实现相同的效果。仅定义getter也将使其成为只读

但是,vanilla javascript中没有隐式语法来处理类型检查,这意味着必须在函数中使用typeof==或instanceof手动完成

使用八达通类将产生以下结果:

class Octopus{
    constructor(classAttr){
        if (typeof classAttr !== 'string' && typeof classAttr !== 'object') { 
            throw new TypeError('classAttr is neither a string nor an object');
        }
        if (typeof classAttr === 'object') {
            Object.assign(this,classAttr);
        }
        else {
            this.classAttr = classAttr;
        }
    }

    //readonly, because there is no setter
    get numberOfLegs(){
        return 8;
    }
}

let octopus = new Octopus('bigEyed');
console.log(octopus.numberOfLegs);     // 8
console.log(octopus.classAttr);        // bigEyed

我认为在JavaScript中没有实现这一点的方法。你必须在构造函数中使用它,我不认为有一种方法可以在JavaScript中实现这一点。你必须在构造函数中使用它。更简单的方法是将输入参数与属性名匹配:构造函数{classAttr}={}{}{Object.assignthis,{classAttr};}允许你在没有参数的情况下调用构造函数,默认情况下将所有内容初始化为未定义。我知道你回答了这个问题。我相信你已经知道了解构和默认参数是如何工作的;更简单的方法是将输入参数与属性名匹配:构造函数{classAttr}={}{}{Object.assignthis,{classAttr};}the={}允许您在没有参数的情况下调用构造函数,以在默认情况下将所有内容初始化为未定义。我知道您已经回答了问题。我相信你已经知道了解构和默认参数是如何工作的;
class Octopus{
    constructor(classAttr){
        if (typeof classAttr !== 'string' && typeof classAttr !== 'object') { 
            throw new TypeError('classAttr is neither a string nor an object');
        }
        if (typeof classAttr === 'object') {
            Object.assign(this,classAttr);
        }
        else {
            this.classAttr = classAttr;
        }
    }

    //readonly, because there is no setter
    get numberOfLegs(){
        return 8;
    }
}

let octopus = new Octopus('bigEyed');
console.log(octopus.numberOfLegs);     // 8
console.log(octopus.classAttr);        // bigEyed