Javascript 之 面向对象

 1 <script type="text/javascript">
 2   /*
 3   01-创建对象
 4   */
 5   var obj = new Object(); // 创建对象
 6   obj.name = "huang";
 7   obj.age = 24;
 8   obj.fn = function(){
 9        return "姓名:"+this.name+" "+"年龄:"+this.age; // 当前作用域下的对象(obj作用域下,代表obj对象本身)
10       };  
 1 /*
 2   02-工厂模式
 3   */ 
 4   var createObjFactory = function(name,age){
 5         var obj = new Object();
 6         obj.name = name;
 7         obj.age = age;
 8         obj.fn = function(){
 9             return "姓名:"+this.name+" "+"年龄:"+this.age; 
10             };
11         return obj;
12       };
13       
14       // 创建一个用户对象
15   var user = createObjFactory("huang",24);
 1 /*
 2       03-构造函数模式(改良后的工厂方法)
 3       */
 4       /*
 5       ①构造函数 没有 new Object()
 6       ②this 就相当于 obj
 7       ③后台会自动创建对象
 8       ④不需要返回对象
 9       ⑤构造函数必须使用 new 运算符
10       */
11       var Constructor = function(name,age){ // this 代表Constructor (构造函数名最好大写)
12           this.name = name;
13           this.age = age;
14           this.fn = function(){
15               return "姓名:"+this.name+" "+"年龄:"+this.age; 
16               };
17           };
18    
19    // 创建对象
20    var constructor1 = new Constructor("张",25);
21    var constructor2 = new Constructor("王",29);
1 /*
2    04-对象冒充
3    */ 
4    var o = new Object();
5    Constructor.call(o,‘张三‘,26);
 1 /*
 2       05-原型
 3       ①地址共享
 4       ②每一个原型都有一个prototype属性
 5       */
 6       var PrototypeFn=function(){};
 7       
 8       PrototypeFn.prototype.userName="小花"; // 原型属性
 9       PrototypeFn.prototype.age = 18;
10       PrototypeFn.prototype.fn = function(){
11            return "姓名:"+this.userName+";年龄:"+this.age;
12           }
13           
14           var prototypeFn1 = new PrototypeFn();
15           var prototypeFn2 = new PrototypeFn();
16           
17           // 5.1
18           document.write(prototypeFn1.constructor); // 构造属性(会打印出构造函数本身)
19           
20           // 5.2 返回true  地址是相同的
21           document.write(prototypeFn2.fn==prototypeFn1.fn);
22           
23           // 5.3 判断一个对象的实例是否是一个原型对象
24           document.write(PrototypeFn.prototype.isPrototypeOf(prototypeFn1));
25           
26           prototypeFn1.userName = "张三"; // 实例属性
27           document.write(prototypeFn1.age); // 打印出原型的属性
28           document.write(prototypeFn1.userName);  // 打印出实例属性 “张三” 就近原则
29           
30           // 5.4 删除实例属性
31           delete prototypeFn1.userName; //  (实例对象无法删除原型属性)
32           document.write(prototypeFn1.userName); // 打印出原型属性 “小花”
33           
34           // 5.5 删除原型属性
35           delete PrototypeFn.prototype.userName; 
36           document.write(prototypeFn1.userName);
37           document.write(prototypeFn1.userName+"<br>");
38           
39           // 5.6 判断实例中对象中是否有指定的属性 hasOwnProperty() 方法无法判断 原型对象中是否有此属性
40           prototypeFn1.sex = ‘男‘;
41           document.write(prototypeFn1.hasOwnProperty(‘sex‘)+"<br>"); // 结果: true
42           document.write(PrototypeFn.hasOwnProperty(‘age‘)+"<br>");
43           
44           // 5.7 可以通过 in 判断是否存在属性 (无论是实例属性还是原型属性 只要有就返回 true否则返回 false)
45           document.write((‘sex‘ in prototypeFn1)+"<br>"); // 结果: true
46           document.write((‘age‘ in prototypeFn1)+"<br>"); // 结果: true
47           
48           // 5.8 判断 原型中是否有属性
49           var isProtopotyProperty=function(obj,propertyName){
50                 return !obj.hasOwnProperty(propertyName) && (propertyName in obj)
51               }
52           document.write(isProtopotyProperty(prototypeFn1,‘age‘)+"<br>"); // 结果: true
53           document.write(isProtopotyProperty(prototypeFn1,‘sex‘)+"<br>"); // 结果: false
 1 /*
 2       06-使用字面量的方式创建原型
 3       */
 4       var PrototypeFn=function(){};
 5       var prototypeFn1 = new PrototypeFn();
 6       
 7       // 6.1 无法使用对象实例访问到 prototype
 8       document.write(prototypeFn1.prototype+"<br>"); // 结果: undefined
 9       
10       // 6.2 可以通过 __proto__ 去访问
11       document.write(prototypeFn1.__proto__+"<br>");  // 结果 object
12       
13       // 6.3 使用对象名可以访问
14       document.write(PrototypeFn.prototype+"<br>"); // 结果 object
15       
16       // 6.4 使用字面量的方式创建原型对象,这里{}就是对象,new Object 相当于{}
17       PrototypeFn.prototype={
18           userName:"张三",
19           age:19,
20           fn:function(){
21               return "your name is "+this.userName;
22               }
23       }; 
24       
25       var prototypeFn2 = new PrototypeFn();
26       document.write(prototypeFn2.fn()+"<br>");
27       
28       document.write(prototypeFn2.constructor+"<br>"); // 结果是 Object 而不是 PrototypeFn
29       
30       // 6.5 让创建的对象的重新指回 PrototypeFn 要强制的指定
31       PrototypeFn.prototype={
32           constructor:PrototypeFn, // 强制的指向 PrototypeFn
33           userName:"张三",
34           age:19,
35           fn:function(){
36               return "your name is "+this.userName;
37               }
38       }; 
39       
40       var prototypeFn3 = new PrototypeFn();
41       
42       document.write((prototypeFn3.constructor==PrototypeFn)+"<br>"); // 结果是 true 
43       
44       // 6.6 重写原型对象
45       PrototypeFn.prototype={
46           sex:‘女‘,
47           fn:function(){
48               return "your sex is "+this.sex;
49               }
50       }; 
51       
52     var prototypeFn4 = new PrototypeFn();
53     
54     // 原型被重写后 和 之前的实例就切断了
55     document.write(prototypeFn4.userName+"<br>"); // 结果 undefined 
 1 /*
 2       07-扩展 内置引用类型的扩展方法
 3       */
 4       
 5     // 7.1 如 split、substring 都是 是 string对象的原型方法 可以通过下面方式查看
 6       document.write(String.prototype.split+"<br>");
 7       document.write(String.prototype.substring+"<br>");
 8       
 9       // 7.2 自己扩展一个 String 的 原型方法 (在字符串后面添加字符)
10       
11       String.prototype.addString = function(){
12             return this+";this is add string!";
13           }
14           
15       document.write(‘abcde‘.addString()+"<br>"); // 结果 "abcde;this is add string!"
16       document.write("<br>");

Javascript 之 面向对象,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。