<!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