引言:阅读《JavaScript语言精粹》这本书时的一些笔记摘要。
在JavaScript,一切皆对象,对象相当于属性的容器,每一个属性都拥有名字和值。
对象字面量
这是一种简便地创建对象的方式。
var emptyObject = { };
var people = {
firstName:"Lucky",
lastName:"Jing"
}
对象的访问
一般情况下优先使用.
表示法
people["firstName"]
people.firstName
||运算符可以用来填充默认值
var value = people.age || 20;
对象通过引用来传递
对象之间绝对不会发生拷贝,也就是通过赋值运算符=
并不会得到新的实例。
var people1 = people;
people1.firstName = "newName";//直接影响了people.firstName
原型
if(typeof Object.beget !=='function'){
Object.beget = function (object){
var F = function(){};
F.prototype = object;
return new F();
};
}
var otherPeople = Object.beget(People);
当我们对otherPeople的属性进行更改的时候是不会触及到原型的。相反,如果我们对原型进行更改,那么对所有基于该原型创建的对象可见,其实就是继承的实现。
反射
通过typeof
检查对象的属性的时候,是会顺着它的原型链依次查找的,例如每一个对象都继承了Object
的toString()
方法,那么调用typeof people.toString
将会返回一个确定的值function
,尽管我们再声明People
时并没有显式指定toString()
方法。
hasOwnProperty
方法可以检测对象独有的属性,换句话说,也就是不会顺着原型链进行查找。
删除
delete
运算符可以删除对象的属性,但是不会触及原型链。例如people1的name属性值为newName,删除之后,则再次调用时,就会输出其原型的name属性值。
避免全局变量污染的方法之一
最小化全局变量
在程序中只出现一个全局变量,而把其他的通过类似于namespace的方式(这在C++中非常常见)包裹起来,例如:
var MYAPP = {};
MYAPP.const= {
PI:3.1415926
};
MYAPP.value= {
result:undefined
};
MYAPP.value.result = MYAPP.const.PI;