什么是原型:
我们创建的每一个函数(无论是普通函数还是构造函数),解析器都会往函数添加一个属性prototype
prototype这个属性对应的这个对象,我们称这一个对象就是我们所得的原型对象
//我们将一个构造函数称为类,这里叫Person类
function Person() {
}
function Dog() {
}
//在Hbuil中测试
console.log(Person.prototype);//[object Object]
console.log(Dog.prototype)//[object Object]
原型对象怎么产生的
原型对象具体解析:
1.我们所创建的每一个函数,解析器都会向函数中添加一个prototype属性
2.这个属性对应着一个对象,这个对象就是所谓的原型对象
3.如果函数作为普通形式调用,prototype是不起任何作用的
4.当函数通过构造函数调用时,它所创建的对象都会有一个隐含的prototype属性,指向构造函数的原型对象,我们可以通过__prototype__来访问到这个属性
function myClass() {
}
var mc = new myClass();
console.log(mc.__proto__)//在hbuild中显示 "[object Object]"
console.log(myClass.prototype)//"[object Object]"
//通过构造函数myClass调用时,创建的mc对象,有一个隐含的属性,这个属性执行函数的原型对象,所以mc对象对象的地址和原型对象对应的地址是一样的
//判断mc实例是否和myClass.prototype属性指向的是否是同一个对象
console.log(mc.__proto__ == myClass.prototype);//"true"
原型对象有什么用
原型对象相当于一个公共的区域,所有的同一类的实例都可以访问这个原型对象,比如构造实例mc1,mc2,mc3,都可以访问prototype,我们可以将对象中公共的内容统一设置到原型对象中
var mc = new myClass();
//往myClass中的prototype原型中添加属性name
myClass.prototype.name = "candy";
myClass.prototype.sayName = function () {
alert("hello," + myClass.prototype.name)
}
mc.sayName()//hello,candy
//在mc中找不到sayName就往原型中找,相当于mc.__proto__.sayName()
所以我们可以共同的属性方法,保存在原型对象里面,所有的对象都可以访问到,并且不会污染到全局作用域,我们必须清楚是往哪个类的原型对象添加方法或属性
function MyClass() {
}
function MyClass2() {
}
var mc = new MyClass();
var mc2 = new MyClass2();
//往myClass类中添加sayName方法
MyClass.prototype.sayName = function () {
alert('hello');
}
mc.sayName()//hello
mc2.sayName()//报错Uncaught TypeError: mc2.sayName is not a function
总结:
1、往原型对象中添加函数可以确保函数只有一个并且不会污染到全局作用域
2、以后我们在创建构造函时,可以将这些对象公用的属性和方法统一添加到构造函数的原型对象中,这样不用分别给每一个对象添加相同的方法,它不会影响到全局作用域,每个相同的类的对象都可以使用这些属性和方法