面向对象与原型

原型概念:

      我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。逻辑上可以这么理解,prototype通过调用构造函数而创建的那个对象的原型对象。使用原型的好处可以让所有对象实例共享它所包含的属性和方法。也就是说,不必在构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。

function Box(name,age){
 this.name=name;       //实例属性
 this.age=age;
 this.run=function(){  //实例方法
  return this.name+this.age+'运行中。。。'
 }
}


//原型
function Box(){}
Box.prototype.name='lee';
Box.prototype.age=100;
Box.prototype.run=function(){
 return this.name+this.age+'运行中。。。'
}
var box1=new Box();
var box2=new Box();
alert(box1.run==box2.run)  //true
//如果是实例方法,不同的实例化,他们的方法地址是不一样的,是唯一的
//如果是原型方法,那么他们地址是共享的,大家都是一样

alert(box1.prototype)  //这个属性是一个对象,访问不到

alert(box1.__proto__) //这个属性是一个指针指向prototype原型对象

alert(box1.constructor)  //构造属性,可以获取构造函数本身

                                 //作用是被原型指针定位,然后得到构造函数本身

                                 //其实就是对象实例对应原型对象的作用,连接作用

 原型模式的执行流程:

1,先查找构造函数实例里的属性和方法,如果有,立刻返回

2,如果构造函数实例里没有,则去它的原型对象里找,如果有,就返回

虽然我们可以通过对象实例访问保存在原型中的值,但却不能访问通过对象实例重写原型中的值 

<1 判断实例中是否有属性

box1.hasOwnProperty('name');   

<2 // in 只要有的就会返回,判断不管实例还是原型里,只要有就是true

alert('name' in box1);

<3 如何判断只有原型里有

//判断只有原型里有name
function isProperty(object,property){
 return !object.hasOwnProperty(property)&& (property in object)
}

alert(isProperty(box1,'name'))

function Box(){}

var box=new Box();

//alert(box.prototype);    //使用对象实例无法访问到prototype

//alert(box.__proto__);    //使用对象实例访问prototype的指针 

alert(Box.prototype)      //使用构造函数名(对象名)访问prototype

                    

猜你喜欢

转载自my.oschina.net/u/1425277/blog/1822167