<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascript"> //创建对象 //原型模式 //每一个function都有一个prototype //所有new出来的对象都可以共用proptotype的属性和方法 function Person(){} Person.prototype.name = "宝清老窖"; Person.prototype.sayName = function(){ alert(this.name); } var person1 = new Person(); person1.sayName();//宝清老窖 var person2 = new Person(); person2.sayName();//宝清老窖 alert(person1.sayName == person2.sayName);//true //person1跟person2访问的都是同一组属性和同一个sayName方法 //------------------------------------------------------------------------ //1、理解原型对象 //无论什么时候,只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性 //这个属性指向了函数的原型对象 //在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性, //这个属性指向了protoype所在函数的指针 //即:Person.prototype.constructor指向了Person //创建类自定义的构造函数之后,其原型对象默认只会取得construnctor属性; //至于其他方法,则都是从Object继承而来的。 //当调用构造函数new一个实例后,该函数内部包含一个指针叫[[Prototype]],指向原型对象 //但是在Chrome、Firefox浏览器里面这个属性名字叫__proto__ alert(person1.__proto__ == person2.__proto__); //true alert(person1.__proto__ == Person.prototype); //true alert(person2.__proto__ == Person.prototype); //true alert(Person.prototype.constructor == Person); //true //虽然person1和person2都没有属性,但是却都能调用sayName方法 //这是一个查找过程,即:实例没有属性的话,就去原型里面找 //isPrototypeOf方法来确定对象之间是否存在这种关系 alert(Person.prototype.isPrototypeOf(person1)); //true alert(Person.prototype.isPrototypeOf(person2)); //true //获取[[Propertype]]的值 alert(Object.getPrototypeOf(person1) == Person.prototype); //true Object.getPrototypeOf(person1).sayName(); //宝清老窖 //Object.getPrototypeOf()获取对象原型很方便,在实现继承的情况下非常重要 //当代吗读取对象的某个属性的时候,都会执行一次搜索 //首先从对象实例本身开始,如果找到返回该值 //如果没有找到,就查找原型对象,如果找到就返回 //所以,在我哦们调用person1.sayName()的时候,会执行两次搜索 //这正是多个对象实例共享原型所保存的属性和方法的原理 //-------------------------------------------------------------- function Person(){} Person.prototype.name = "宝清老窖"; Person.prototype.sayName = function(){ alert(this.name); } var person1 = new Person(); var person2 = new Person(); person1.name = "大美女"; person1.sayName(); //来自实例 大美女 person2.sayName(); //来自原型 宝清老窖 //所以名字相同情况下,实例属性会屏蔽原型属性 //可以通过delete删除实例属性,从而重新打开重新打开原型属性 delete person1.name; person1.sayName(); //来自原型 宝清老窖 //使用hasOwnProperty();可以检查一个对象是否在实例中 Person.prototype.age = 100; person1.age = 20; console.log(person1.hasOwnProperty('age')); //true console.log(person2.hasOwnProperty('age')); //false </script> </body> </html>
提取出js
//创建对象 //原型模式 //每一个function都有一个prototype //所有new出来的对象都可以共用proptotype的属性和方法 function Person(){} Person.prototype.name = "宝清老窖"; Person.prototype.sayName = function(){ alert(this.name); } var person1 = new Person(); person1.sayName();//宝清老窖 var person2 = new Person(); person2.sayName();//宝清老窖 alert(person1.sayName == person2.sayName);//true //person1跟person2访问的都是同一组属性和同一个sayName方法 //------------------------------------------------------------------------ //1、理解原型对象 //无论什么时候,只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性 //这个属性指向了函数的原型对象 //在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性, //这个属性指向了protoype所在函数的指针 //即:Person.prototype.constructor指向了Person //创建类自定义的构造函数之后,其原型对象默认只会取得construnctor属性; //至于其他方法,则都是从Object继承而来的。 //当调用构造函数new一个实例后,该函数内部包含一个指针叫[[Prototype]],指向原型对象 //但是在Chrome、Firefox浏览器里面这个属性名字叫__proto__ alert(person1.__proto__ == person2.__proto__); //true alert(person1.__proto__ == Person.prototype); //true alert(person2.__proto__ == Person.prototype); //true alert(Person.prototype.constructor == Person); //true //虽然person1和person2都没有属性,但是却都能调用sayName方法 //这是一个查找过程,即:实例没有属性的话,就去原型里面找 //isPrototypeOf方法来确定对象之间是否存在这种关系 alert(Person.prototype.isPrototypeOf(person1)); //true alert(Person.prototype.isPrototypeOf(person2)); //true //获取[[Propertype]]的值 alert(Object.getPrototypeOf(person1) == Person.prototype); //true Object.getPrototypeOf(person1).sayName(); //宝清老窖 //Object.getPrototypeOf()获取对象原型很方便,在实现继承的情况下非常重要 //当代吗读取对象的某个属性的时候,都会执行一次搜索 //首先从对象实例本身开始,如果找到返回该值 //如果没有找到,就查找原型对象,如果找到就返回 //所以,在我哦们调用person1.sayName()的时候,会执行两次搜索 //这正是多个对象实例共享原型所保存的属性和方法的原理 //-------------------------------------------------------------- function Person(){} Person.prototype.name = "宝清老窖"; Person.prototype.sayName = function(){ alert(this.name); } var person1 = new Person(); var person2 = new Person(); person1.name = "大美女"; person1.sayName(); //来自实例 大美女 person2.sayName(); //来自原型 宝清老窖 //所以名字相同情况下,实例属性会屏蔽原型属性 //可以通过delete删除实例属性,从而重新打开重新打开原型属性 delete person1.name; person1.sayName(); //来自原型 宝清老窖 //使用hasOwnProperty();可以检查一个对象是否在实例中 Person.prototype.age = 100; person1.age = 20; console.log(person1.hasOwnProperty('age')); //true console.log(person2.hasOwnProperty('age')); //false