日期:2014-05-16 浏览次数:20430 次
一.基础特性
for(myVar in obj){
if(obj.hasOwnProperty(myVar)){
...
}
}
?for in 语句可以用来遍历一个对象中所有的属性名(包括原型中的).但属性名出现的顺序是不确定的,因此要对任何可能出现的顺序有所准备。如果需要保证顺序,应该使用 for 语句并搭配hasOwnProperty判断.这样就不必担心查找出原型链中的属性了。var empty_object = {};
var stooge = {
"first-name" : "Jerome",
"last-name" : "Howard",
age : 46
};
??? 如果属性名是一个合法的Javascript 标识符并且不是保留的关键字,则并不强制使用双引号来括住属性名。这里由于 '-' 是非法的变量字符,所以"first-name" 是必须的,而如果对于 first_name, 可以选择不使用双引号.window.alert(stooge.unknownProperty); // undefined window.alert(stooge.unknownProperty || "未知值!"); // 未知值!?
stooge && stooge.func && stooge.func();?
var x = stooge;
window.alert(x.age === stooge.age); // true
var a = {}, b = {}, c = {}; // a ,b 和 c 每个都引用一个不同的空对象.
a = b = c = {}; // a ,b 和 c 都引用同一个空对象.
// 当创建一个新对象时,你可以选择某个对象作为它的原型。下面给Object添加一个beget方法.
// 该方法创建一个使用原对象作为其原型(prototype)链的新对象(简单地继承).
if(typeof Object.beget !== 'function'){
Object.beget = function(obj){
var fun = function(){};
fun.prototype = obj;
return new fun();
};
}
var another_stooge = Object.beget(stooge);// 利用原型链继承。
window.alert(another_stooge["first-name"]);
// 尝试对新对象的修改将不会反射到源对象中(stooge).
another_stooge.age = 24;
???原型链只有在检索值的时候才会被用到,如果我们尝试去获取对象的某个属性值,且该对象没有此属性名,那么Javascript 会试着从原型对象中获取该属性,该过程将会一直向上递归到Object.prototype 为止. 如果想要的属性值完全不存在于原型链中,那么结果就是 undefined值,这个过程称为 委托 .stooge.profession = 'actor'; window.alert(another_stooge.profession);?
another_stooge.willBeDelete = {};
delete another_stooge.willBeDelete;
// another_stooge.willBeDelete = undefined
window.alert(another_stooge.willBeDelete);
// 无效,profession 是原型链中的属性.
delete another_stooge.profession;
window.alert(another_stooge.profession);
?还有一种值得注意的情况是删除对象的属性有可能将原型链中被隐藏的属性暴露出来.// 此时原型链中的profession 将被隐藏,因为向上递归查找属性时将会优先返回 对象自身的profession.
another_stooge.profession = "actress";
// 删除掉对象自身的profession,此时查找profession 将会返回原型链中的profes