明确表示this.foo
(正如您已经理解的那样)您对.foo
引用的当前对象的属性感兴趣this
。因此,如果您使用:this.foo = 'bar';
您将设置由equalsfoo
引用的当前对象的属性。this
bar
JavaScript 中的this
关键字并不总是与 C++ 中的相同。这里我可以举个例子:
function Person(name) {
this.name = name;
console.log(this); //Developer {language: "js", name: "foo"} if called by Developer
}
function Developer(name, language) {
this.language = language;
Person.call(this, name);
}
var dev = new Developer('foo', 'js');
在上面的示例中,我们使用函数Person
的上下文调用函数,Developer
因此this
引用将由Developer
. 正如您可能从console.log
结果this
中看到的那样来自Developer
. 使用方法的第一个参数,call
我们指定调用函数的上下文。
如果您this
不简单地使用您创建的属性将是一个局部变量。你可能知道 JavaScript 有函数作用域,所以这就是为什么变量是局部的,只对声明它的函数可见(当然所有它都是在父函数内部声明的子函数)。这是一个例子:
function foo() {
var bar = 'foobar';
this.getBar = function () {
return bar;
}
}
var f = new foo();
console.log(f.getBar()); //'foobar'
当您使用var
关键字时,情况就是如此。这意味着如果您不幸bar
忘记将成为全局变量,您将定义为局部变量。var
bar
function foo() {
bar = 'foobar';
this.getBar = function () {
return bar;
}
}
var f = new foo();
console.log(window.bar); //'foobar'
确切地说,本地范围可以帮助您实现隐私和封装,这是 OOP 的最大好处之一。
现实世界的例子:
function ShoppingCart() {
var items = [];
this.getPrice = function () {
var total = 0;
for (var i = 0; i < items.length; i += 1) {
total += items[i].price;
}
return total;
}
this.addItem = function (item) {
items.push(item);
}
this.checkOut = function () {
var serializedItems = JSON.strigify(items);
//send request to the server...
}
}
var cart = new ShoppingCart();
cart.addItem({ price: 10, type: 'T-shirt' });
cart.addItem({ price: 20, type: 'Pants' });
console.log(cart.getPrice()); //30
JavaScript 作用域的另一个好处是模块模式。在模块模式中,您可以使用 JavaScript 的本地功能范围来模拟隐私。使用这种方法,您可以同时拥有私有属性和方法。这是一个例子:
var module = (function {
var privateProperty = 42;
function privateMethod() {
console.log('I\'m private');
}
return {
publicMethod: function () {
console.log('I\'m public!');
console.log('I\'ll call a private method!');
privateMethod();
},
publicProperty: 1.68,
getPrivateProperty: function () {
return privateProperty;
},
usePublicProperty: function () {
console.log('I\'ll get a public property...' + this.publicProperty);
}
}
}());
module.privateMethod(); //TypeError
module.publicProperty(); //1.68
module.usePublicProperty(); //I'll get a public property...1.68
module.getPrivateProperty(); //42
module.publicMethod();
/*
* I'm public!
* I'll call a private method!
* I'm private
*/
parentless 包装匿名函数有一点奇怪的语法,但暂时忘记它(它只是在初始化后执行函数)。从使用示例中可以看出该功能,但好处主要是提供了一个简单的公共接口,它不会让您参与所有实现细节。有关该模式的更详细说明,您可以查看我在上面放置的链接。
我希望通过this
:-) 信息可以帮助您了解 JavaScript 的一些基本主题。