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

javascript函数用作对象基础时的变量-,javascript,function,object,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") ca

当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”关键字时,您引用的是一个特定于“this”的变量,在您的示例中,它是一个cat对象


例如,如果您有一个名为color的javascript变量,并且您有一个包含color变量的cat对象,如果您想在特定对象的范围内引用color变量,您将使用this.color,而不是color。

如果您想更改名称

cat1 = new cat("Sylvester");
cat1.name = 'Tom';
cat1.talk();​​
名称
仍然是
“西尔维斯特”


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

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

function Cat(name) {
    this.name = name;
}
Cat.prototype = {
    talk: function () {
        alert(this.name + ' says meeow!');
    }
};
注意函数是如何在构造函数中不设置的?talk函数在调用对象之外不会引用
名称

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

var a = new Cat('bob');
a.talk(); //'Bob says meeow!'
a.name = 'Joe';
a.talk(); //'Joe says meeow!'
如果您计划在不同的对象上下文中调用函数,则使用
也很重要:

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

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

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


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

这是一条注释,而不是答案。答案很好。还值得注意的是,如果选择
变量
而不是
此变量,则
变量
的执行速度稍快。琐碎的jsperf@swaggler,过早优化是万恶之源等等。您的测试没有考虑实例数的内存使用情况。如果您使用构造函数中定义的
talk
函数创建了一百万个
Cat
实例,那么将有一百万个不同的函数需要存储在内存中。如果您将
talk
函数存储在原型上,则只需要存在一个实例。啊,好的。为糟糕的测试道歉。@Swagler,我不是说测试不好,我只是说您需要在应用程序的上下文中进行测试。@Swagler,性能上的差异非常小,除非您在应用程序中遇到重大问题,否则不必进行测试。正如我在回答中所说,在一种情况下,变量是可以公开访问的,而在另一种情况下,它们不是。应该鼓励为工作使用正确的工具,而不是担心性能的微小提高,除非性能确实是一个问题。由于JavaScript的大部分是异步的,所以开发人员可以侥幸逃脱。就性能而言,大多数周期都将等待用户。