ES6 之前创建对象的方式
利用new Object() 创建对象
let obj = new Oject();
利用对象字面量创建对象
var obj2 = {};
利用构造函数创建对象
function Star(uname, age){
this.uname = uname;
this.age = age;
this.sing = function(){
log("我会唱歌")
}
}
let dmt = new Star("lll",18);
let zxy = new Star("mmm",18);
dmt.sing();
zxy.sing();
- 实例成员:就是构造函数内部通过 this 添加的成员 ,uname、age、sing就是实例成员;;实例成员只能通过实例化的对象来访问。(不能通过构造函数来访问)
- 静态成员:就是在构造函数本身上添加的成员,静态成员只能通过构造函数来访问。
Star.sex = 'male';
log(zxy.sex); //输出:undefined
log(Star.sex); //输出:male
缺点:
构造方法存在浪费内存的问题(每个对象创建时都会开辟一个空间存放方法[复杂对象])
解决方法:
可以把不变的方法直接定义到prototype对象上,这样所有的实例可以共享这些方法。如下:
原型对象
function Star(uname, age){
this.uname = uname;
this.age = age;
}
Star.prototype.sing = function(){
log("我会唱歌")
}
let dmt = new Star("lll",18);
let zxy = new Star("mmm",18);
dmt.sing(); //每个对象身上都有一个--proto--指向构造函数的原型对象,故可访问。
zxy.sing();
对象原型–proto-- 和构造函数prototype里面都有一个constructor属性,它指回构造函数本身。
但有时我们需要手动利用constructor这个属性指回原来的构造函数。比如下面:
Star.prototype.sing = function(){
log("我会唱歌")
}
Star.prototype.act = function(){
log("我会演戏")
}
//往往写成下面的形式(代码简洁直观)
//上面的方式时给原型对象中添加方法,下面相当于让原型对象直接等于,会覆盖掉构造函数
Star.prototype = {
//需要手动利用constructor指向原来的构造函数
constructor:Star,
sing:function(){
log("我会唱歌");
},
act:function(){
log("我回演习")
}
}