• js创建对象之原型模式1


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

      

  • 相关阅读:
    BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第13章节--使用业务连接服务创建业务线解决方式 创建启用BCS的业务解决方式
    POI 导入excel数据自己主动封装成model对象--代码分析
    四旋翼飞行器Quadrotor飞控之 PID调节(參考APM程序)
    Detours改动段属性漏洞
    C++中父类的虚函数必需要实现吗?
    深入理解JavaScript系列(12):变量对象(Variable Object)
    CSS 类、伪类和伪元素差别具体解释
    Qt Quick 之 PathView 具体解释
    读《一年一度屈原祭,端午时节话公知》有感
    Volley简单学习使用五—— 源代码分析三
  • 原文地址:https://www.cnblogs.com/xudy/p/5421902.html
Copyright © 2020-2023  润新知