var obj = new Object();
obj.name = "saa";增加name属性
delete obj.name;删除
var obj = {name:"sun",age:18};
访问属性的两种方式:
– .访问
对象.属性名
– []访问
对象[‘属性名’] 这种方式可以使用字符串变量
工厂模式
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
构造函数模式
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
原型模式
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName(); //"Nicholas"
hasOwnProperty()方法,属性是存在于实例中返回true
alert(person1.hasOwnProperty("name"));
in 操作符不论在实例和原型都返回true 结合使用判断是否在原型中
function hasPrototypeProperty(object, name){
return !object.hasOwnProperty(name) && (name in object);
}
尽管可以随时为原型添加属性和方法,
把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系
function Person(){
}
var friend = new Person();
混合模式
Person.prototype = {
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
sayName : function () {
alert(this.name);
}
};
friend.sayName(); //error
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Court"];
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
寄生构造函数模式 用于自定义一些方法
稳妥构造函数模式 安全性需要时使用
原型与原型链
所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)
所有函数拥有prototype属性(显式原型)(仅限函数)
原型对象:拥有prototype属性的对象,在定义函数时就被创建
实例person1的隐式原型指向它构造函数的显式原型,也就是
person1.__proto__ === Person.prototype
当调用某种方法或查找某种属性时,首先会在自身调用和查找,如果自身并没有该属性或方法,则会去它的__proto__属性中调用查找,也就是它构造函数的prototype中调用查找。
默认原型prototype都会包含一个内部指针,指向 Object.prototype。
for in循环,一般对象有多少键值对,就循环多少次
key存储的值都是字符串格式的
遍历时,大部分浏览器把数字由小到大排在前面,在依次排字符串,小数不算数字
for(var key in obj){
console.log(key); //输出属性名
console.log(obj[key]); //输出属性值
}
注意:obj.key 和obj['key']是获得属性名为key的对应属性值,没有返回undefined
对象的赋值,是地址的复制赋值。所以修改对象内容,指向同一地址的变量都会变
数据属性 数据属性包含一个数据值的位置。在这个位置可以读取和写入值
收三个参数:属性所在的对象、属性的名字和一个描述符对象(configurable、enumerable、writable 和 value)
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
访问器属性 [Configurable] [Enumerable](能否通过 for-in 循环返回属性) [Get] [Set]
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});