javascript - 当 javascript 函数用作对象的基础时的变量 -

标签 javascript function object

当 javascript 函数用作对象的基础时,使用“this.name”而不是“name”有什么好处 -

function cat(name) {    
    this.name = name;
    this.talk = function() {
        alert( this.name + " says meeow!" )
        alert( name  + " says meeow!" )
    }
} 

cat1 = new cat("Sylvester")
cat1.talk()  

最佳答案

使用 this.variable 而不是 variable 的意义在于,您可以在构造函数范围之外引用变量,而不会污染全局命名空间。

在您的示例中,构造函数中添加了 talk 函数。对于更面向对象的 JavaScript 方法,talk 函数通常定义在 Catprototype 上:

function Cat(name) {
    this.name = name;
}
Cat.prototype = {
    talk: function () {
        alert(this.name + ' says meeow!');
    }
};

请注意构造函数中未设置函数的原因是什么? talk 函数不会引用调用对象之外的 name

此外,在实例化 Cat 对象后,用户可以通过直接访问该属性来覆盖该值:

var a = new Cat('bob');
a.talk(); //'Bob says meeow!'
a.name = 'Joe';
a.talk(); //'Joe says meeow!'

如果您计划在不同的对象上下文中调用函数,使用 this 也很重要:

function foo(bar) {
    this.baz = bar;
}

foo('fizz'); //sets window.baz === 'fizz'

var a = {};
foo.call(a, 'buzz'); //sets a.baz === 'buzz'

如果您希望值在构造函数调用后在外部可编辑,请务必在构造函数范围内声明函数以封装值并防止进一步修改。

关于javascript - 当 javascript 函数用作对象的基础时的变量 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9287648/

相关文章:

javascript - 如何将重复查询合并到 javascript/jquery 中的一个函数

c++ - 带有自定义分配器的 Boost.Function

android - 应为 BEGIN_OBJECT 但在第 1 行第 2 列路径处为 BEGIN_ARRAY

django - 'QuerySet' 对象在使用 timesince 时没有属性 'year'

javascript - Highcharts 尝试在列的左侧直接显示标签

javascript - 当删除同级项时,使 flex 元素自动调整大小以填充空间

javascript - 覆盖权限不起作用| Discord.js 主控

javascript - 将 td 内容溢出到下一个 td 元素,而不在 HTML 表格中进行替换

Python: TypeError: 'function' 对象没有属性 '__getitem__'

java - Java 是否有统一原始数据类型和对象数据类型的长期计划?如何?