对象创建的三种方式:
- 利用new Object()创建对象;
var obj = new Obejct();
- 利用对象字面量创建对象;
var obj= {};
- 利用构造函数创建对象;
function Star(name ,age){ this.name = name; this.age = age; this.sing=function(){ console.log("唱歌"); } }
var gg = new Star('张国荣',18);
gg.sing();new 做了哪些事情?
在内存中创建了一个空对象;让this指向这个新对象;执行构造函数里面的代码,给这个新的对象添加属性和方法;返回这个新对象(所以构造函数中不需要return);
实例成员和静态成员
实例成员:通过this添加的成员,只能通过实例化的对象访问;如上述代码中的Star对象中的name,age,sing成员;
静态成员:在构造函数上直接添加的属性,只能通过构造函数访问;如Star.sex=“男”;通过gg这个实例化的对象是访问不了的;
构造函数的问题
1、浪费内存;(每个实例化的对象中的函数都会开辟一个新的内存空间;)解决方法:protptype(原型对象)
构造函数原型对象:prototype
构造函数通过原型分配的函数是所有对象共享的;javaScript规定每个构造函数中都会有一个prototype属性,指向另一个对象,这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造 函数所拥有;(我们可以把不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法);
一般情况下,公共的属性定义在构造函数中,但公共的方法定义在构造函数的原型中;
Star.prototype.sing=function(){ console.log("我会唱歌"); }
var gg = new Star('张国荣',18);
var ldh =new Star('刘德华',18);
gg.sing();
ldh.sing();
对象原型:__proto__
对象都会有一个属性__proto__指向构造函数的protype原型对象,之所以我们在对象中可以使用构造函数prototype原型对象的属性和方法,就是因为有__proto__原型的存在;
如果我们自改了原来的原型对象,给对象赋值给一个对象必须手动添加constrictor属性指回原来的构造函数;
构造函数、实例、原型对象三者的关系: