在了解原型对象前需要先了解以下问题:
1、什么是构造函数
在 JavaScript 中,用 new 关键字来调用的函数,称为构造函数。构造函数首字母一般大写
2、为什么要使用构造函数?
比如我们现在想要记录一些班级学生信息
var p1 = { name: 'zs', age: 6, gender: '男', hobby: 'basketball' }; var p2 = { name: 'ls', age: 6, gender: '女', hobby: 'dancing' }; var p3 = { name: 'ww', age: 6, gender: '女', hobby: 'singing' }; var p4 = { name: 'zl', age: 6, gender: '男', hobby: 'football' };
但是我们会发现,其实很多学生的属性是重复的,这样会导致很多代码浪费,这时就用到了构造函数。
function Person(name, gender, hobby) {
this.name = name;
this.gender = gender;
this.hobby = hobby;
this.age = 6;
}
var p1 = new Person('zs', '男', 'basketball');
var p2 = new Person('ls', '女', 'dancing');
var p3 = new Person('ww', '女', 'singing');
var p4 = new Person('zl', '男', 'football');
我们将 重复的属性封装到函数中,然后通过构建函数将学生信息录入。
注意:
一).当this以普通函数调用时,this指向window
二).当this通过构造函数调用时,this指向构造的函数对象实例
对象的属性已经解决了,但是对象内部的方法却很棘手
function Person(name,gender,hobby){
this.name=name;
this.gender=gender;
this.hobby=hobby;
this.sayName=function(){
alert('hello我是'+ this.name);
}
}
我们每创建一个实例,就会调用一次sayName方法,这样非常浪费空间。这时原型prototype的出现就很有必要。
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype, MyClass函数中存在显性属性prototype,通过MyClass创建的实例存在隐性属性,可以通过__proto__来访问,并且他们都指向同一块内存空间。
function Person(name,gender,hobby){
this.name=name;
this.gender=gender;
this.hobby=hobby;
}
Person.prototype.sayHello=function(){
alert('hello');
}
let p1 = new Person('张三','男','学习');
p1.sayHello();
这样通过Person创建的实例对象都会具有sayHello的方法。