构造函数是创建对象方式的一种,
可以使用new来进行实例化
其中,构造函数首字母需要大写,构造函数中的this指向实例对象;
创建一个构造函数:
function Star(uname, age, sex) {this.uname = uname;this.age = age;this.sex = sex}
实例化:
let zs = new Star(\'张三\', 23, \'男\')console.log(zs);
输出:
通过构造函数可以很方便的创建实例化对象.
但是对象中的方法呢?
原型对象 prototype
作用:共享方法,共享构造函数中的方法,
一般实例对象的公共属性定义到构造函数中,
公共方法则存放到原型对象prototype中:
以下代码给原型对象新增了一个sing方法,
Star.prototype.sing = function () { //原型对象console.log(\"我唱歌不错\");}zs.sing();
实例对象可以直接调用sing方法,输出为:我唱歌不错
这样,所有需要使用该方法的实例对象调用该方法时调用的都是原型对象中的相同的这个sing方法,就节省了内存;
验证:
let zs = new Star(\'张三\', 23, \'男\')let ls = new Star(\'李四\', 22, \'女\')console.log(zs);zs.sing();ls.sing();console.log(zs.sing === ls.sing);
打印结果为true,
可以证明zs和li调用的sing的是同一个sing;
对象原型 proto
对象身上,系统自己添加了一个_proto_指向构造函数的原型对象
方法查找规则 首先看zs对象中是否有sing方法,如果有就执行这个对象上的sing
如果没有,因为有_proto_的存在,就去构造函数原型对象prototype身上去查找sing这个方法
举例:
张三这个实例对象中并没有sing这个方法,我们可以看到最下面有对象原型__proto__,它指向了原型对象,此时,因为张三本身没有sing方法,就会去它的原型对象中查找是否有sing方法:
可以看到它的原型对象中有sing方法,因此可以调用.
总结一下三者的关系:
我们把构造函数Star中的公共方法存放在Star.prototype原型对象中,通过new创建的实例对象上面有一个系统自带的对象原型__proto__,因此实例对象可以通过对象原型来访问原型对象中存放的构造函数公共方法;
原型对象中还有个constructor属性指向了原构造函数,上面是给原型对象添加了一个公共的方法,如果添加了多个呢?
Star.prototype = {sing: function () {console.log(\"sing\");},movies: function () {console.log(\"movies\");}}
这时,就可以通过原型对象调用多个方法,但是此时出现了一个问题,
打印一下此时原型对象的指向:
console.log(Star.prototype.constructor);
指向的并非Star构造函数,这时因为我们给原型对象赋值时,将原来的给覆盖了,此时需要使用constructor重新指向Star:
Star.prototype = {constructor: Star, //如果修改了原来的原型对象.给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数sing: function () {console.log(\"sing\");},movies: function () {console.log(\"movies\");}}console.log(Star.prototype.constructor);
打印结果:Star函数
这样就完成了给原型对象新增多个方法的操作了