1、字面量
var obj = {}
2、构造函数
· 函数名建议首字母大写
· 使用 this 将传入函数的值赋给对象的属性
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var kenscar = new Car("Nissan", "300ZX", 1992);//实例化对象
实例对象添加属性不会影响到构造函数。因此构造函数中可以设置公用的属性,特有属性在各自的实例化对象中添加
kenscar.color = "black";
console.log(kenscar); // {make: "Nissan", model: "300ZX", year: 1992, color: "black"}
console.log(Car)
/* Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}*/
在不修改构造函数的前提下,使用prototype添加新的公用属性。
Car.prototype.color = null;
var newCar = new Car();
var newCar2 = new Car();
console.log(newCar);
console.log(newCar2);
因为js的继承和原型链原理,默认浏览器会层层向上查询。所以通过prototype添加的属性,可以在实例化对象中使用
newCar.color
直接访问到,而不需要通过newCar._proto_.color
来访问。
3、Object.create(指定原型对象[,属性及描述])
允许为创建的对象指定原型对象
let a = {
name: 'hello'
}
let o = Object.create(a)
let b = {}
console.log(o.__proto__); // {name: "hello"}
console.log(b.__proto__); // {constructor: ƒ, __defineGetter__: ƒ, …}
第二个参数可选
var o;
// 创建一个原型为null的空对象
o = Object.create(null, {
// foo会成为所创建对象的数据属性
foo: {
writable:true,
configurable:true,
value: "hello"
},
// bar会成为所创建对象的访问器属性
bar: {
configurable: false,
get: function() { return 10 },
set: function(value) {
console.log("Setting `o.bar` to", value);
}
}
});
console.log(o); // {foo: "hello"}