为什么必须使用函数表达式来定义构造函数内部的方法?

时间:2019-05-16 22:36:42

标签: javascript

在弄乱构造函数时,我注意到以this开头的以函数表达式编写的特权方法可以正常工作,而函数声明返回类型错误,其中function declaration is not a function

我知道我们可以通过内部使用thisthis.functionName

从对象实例公开函数。
var Foo = function(){
    var _color= "blue";
    this.getColor = function(){
            return _color;
    }
    function setColor(newColor){
       this._color = newColor;
        }
}
var bar = new Foo();
console.log(bar.setColor('red'));

关于函数声明function setColor的幕后发生了什么,导致日志输出为Uncaught TypeError: bar.setColor is not a function?提升/声明它的作用域是函数表达式的事实是否与此有关?

2 个答案:

答案 0 :(得分:4)

这是一个关闭。 -Javascript具有词法作用域,构造函数范围与其实例无关。您需要通过this访问实例。您可以通过在构造函数中分配函数引用来存储它。 this.setColor = setColor

答案 1 :(得分:2)

您无法尝试:

var Foo = function(){
    var _color= "blue";
    this.getColor = function(){
            return _color;
    }
    this.setColor = function(newColor){
       this._color = newColor; 
       return this._color;
    }
}
var bar = new Foo();
console.log(bar.setColor('red'));

会发生什么情况,函数声明“ function setColor(newColor)”只是一个表达式,包含在其父函数“ function()”的范围内。这意味着,如果您未将“ setColor ”功能设置/分配给父对象( Foo )中的任何属性,则无法从外部(上)使用该功能范围。另外,您还必须返回“ this._color ”的值,否则console.log将显示“ undefined”。