思考一下,以下输出的是什么:
- function Foo(){
- console.log(this); // 打印 {}?
- }
因为这是一个全局对象,记住,无论父作用域是什么,它都将由子作用域继承。打印出来是 window 对象。上面讨论的三个方法实际上用于设置这个对象。
现在,this 的最后一个类型,在对象中的 this, 如下:
- var person = {
- name: "Stranger",
- age: 24,
- get identity() {
- return {who: this.name, howOld: this.age};
- }
- }
上述使用了 getter 语法,这是一个可以作为变量调用的函数。
- person.identity; // returns {who: "Stranger", howOld: 24}
此时,this 实际上是指对象本身。正如我们前面提到的,它在不同的地方有不同的表现。
5) 理解对象 (Object.freeze, Object.seal)
通常对象的格式如下:
- var marks = {physics: 98, maths:95, chemistry: 91};
它是一个存储键、值对的映射。 javascript 对象有一个特殊的属性,可以将任何东西存储为一个值。这意味着我们可以将一个列表、另一个对象、一个函数等存储为一个值。
可以用如下方式来创建对象:
- var marks = {};
- var marks = new Object();
可以使用 JSON.stringify() 将一个对象转制成字符串,也可以用 JSON.parse 在将其转成对象。
- // returns "{"physics":98,"maths":95,"chemistry":91}"
- JSON.stringify(marks);
- // Get object from string
- JSON.parse('{"physics":98,"maths":95,"chemistry":91}');
使用 Object.keys 迭代对象:
- var highScere = 0;
- for (i of Object.keys(marks)) {
- if (marks[i] > highScore)
- highScore = marks[i];
- }
Object.values 以数组的方式返回对象的值。
对象上的其他重要函数有:
- Object.prototype(object)
- Object.freeze(function)
- Object.seal(function)
Object.prototype 上提供了许多应用上相关的函数,如下:
Object.prototype.hasOwnProperty 用于检查给定的属性/键是否存在于对象中。
- marks.hasOwnProperty("physics"); // returns true
- marks.hasOwnProperty("greek"); // returns false
Object.prototype.instanceof 判断给定对象是否是特定原型的类型。
- function Car(make, model, year) {
- this.make = make;
- this.model = model;
- this.year = year;
- }
- var newCar = new Car('Honda', 'City', 2007);
- console.log(newCar instanceof Car); // returns true
使用 Object.freeze 可以冻结对象,以便不能修改对象现有属性。
- var marks = {physics: 98, maths:95, chemistry: 91};
- finalizedMarks = Object.freeze(marks);
- finalizedMarks["physics"] = 86; // throws error in strict mode
- console.log(marks); // {physics: 98, maths: 95, chemistry: 91}
在这里,试图修改冻结后的 physics 的值,但 JavaScript不允许这样做。我们可以使用 Object.isFrozen 来判断,给定对象是否被冻结:
- Object.isFrozen(finalizedMarks); // returns true
Object.seal 与 Object.freeze 略有不同。 Object.seal() 方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要可写就可以改变。
- var marks = {physics: 98, maths:95, chemistry: 91};
- Object.seal(marks);
- delete marks.chemistry; // returns false as operation failed
- marks.physics = 95; // Works!
- marks.greek = 86; // Will not add a new property
同样, 可以使用 Object.isSealed 判断对象是否被密封。
- Object.isSealed(marks); // returns true
在全局对象函数上还有许多其他重要的函数/方法,在这里找到他们。
6) 理解原型继承
(编辑:ASP站长网)
|