1.构造函数
js的构造函数中可以添加一些成员,可以在构造函数本身上添加,也可以再构造函数内部的this上添加,通过这这两种方式添加的成员,就分别成为静态成员和实例成员
- 静态成员:在构造函数本身上添加的成员称为静态成员,只能由构造函数本身来访问。
- 实例成员:在构造函数内部创建的对象成员称为实例成员,只能由实例化的对象来访问。
function Start (name,age){ this.name = name; } var ldh = new Start('刘德华',33) ldh.sex = '男' console.log(ldh.name,ldh.sex) //刘德华 男 // name--实例成员 sex--静态成员
2.构造函数的问题及prototype
3.原型对象prototype
构造函数通过分配原型分配的函数是所有对象共享的(解决了复杂数据类型浪费内存的问题)
js规定,每一个构造函数都有一个prototype属性,指向另一个对象,注意这个prototype就是一个对象,这和对象的所有属性和方法,都会被构造函数所拥有。
我们把那些不变的方法,直接定义在prototype上,这样所有的对象的示例就可以共享这些方法。
Star.prototype.sing = function(){
console.log("我会唱歌")
}
4.对象原型__proto__
对象都有一个属性__proto__指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为__proto__原型的存在。
__proto__对象原型和原型对象prototype是等价的;
__proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说是一条路线,但是他是一个非标准属性,因此在实际开发中,不可以使用这个属性,他只是内部指向原型对象prototype。
5.原型constructor
对象原型__proto__和原型对象prototype里面都有一个constructor属性,constructor称为构造函数,他指回构造函数本身。
普通状态:constructor指回构造函数Start
其他状态:在原型对象上添加方法和属性,导致constructor被覆盖掉
手动指回:在prototype原型对象上手动增加constructor,并手动指回构造函数Start
Start.prototype = ...会覆盖掉原先的Start.prototype.constructor属性,所以需要添加constructor:Start,让这个属性指回原来的构造函数
5.构造函数、实例、原型对象三者之间的关系。