原型是什么?
- 在构造函数创建对象的时候,系统会默认自动为其创建并关联一个对象,这个对象就是原型
- 原型默认是一个空的对象
- prototype是构造函数的一个属性,它将构造函数和原型关联起来(prototype会创建出一个process对象,该对象可以访问构造函数的原型中的成员)
- 原型对象被创建出来的时候会包含一个默认属性constructor,这个属性存储了构造函数的地址
- 只有函数function才具有prototype属性。这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。
原型的作用
原型中的属性和方法可以被使用该构造函数创建出来的的所有对象使用
原型的访问方法
构造函数.prototype
给原型对象添加属性和方法:
- 方法一:使用对象的动态特性给原型添加方法
构造函数.prototype.属性/方法
例如:
// 当使用构造函数创建的对象访问属性和方法时,先从构造函数内部寻找,
// 如果没有再从原型寻找(如果没有,属性就报undefind,方法就报错not function)。
// 所以构造函数本身和它的原型有同一个方法时,用构造函数自己的
function Person(){
this.name = "cuihao";
};
Person.prototype.name = 'GGOO'
var aa = new Person()
aa.name // 'cuihao'
// 给构造函数的原型添加属性和方法一般使用动态特性添加,动态特性有两种方法,
// 一种是Person.prototype.girlFriend这种点语法,
// 一种是方括号语法Person.prototype[girlFriend]
Person.prototype["boyFriend"] = function(){
console.log("帅哥")
};
- 方法二:直接替换原型对象法
通过对象字面量方式给原型对象直接添加属性和方法
function Person(){
};
// 通过对象字面量方式给原型直接添加属性和方法
Person.prototype = {
name: "cuihao",
say: function(){
console.log("nihao")
}
};
var cui = new Person();
cui.say();
使用直接替换原型对象法,会出现以下问题:
在替换原型之前创建的原型对象,和替换之后创建的新原型对象不是同一个,替换之后的新原型对象会从新开辟一块内存空间,替换之前的原型的方法和属性不能被替换之后再实例化出来的的对象所使用
function Person(){
};
// 直接给原型添加方法和属性
Person.prototype.say = function(){
console.log("这是替换之前的原型的方法");
};
// 在直接替换原型对象之前实例化出来的对象,可以访问原先原型对象的方法和属性
var cui = new Person();
cui.say();
// 直接替换原型对象法
Person.prototype = {
sayHello: function