JavaScript面向对象编程之创建对象

本文详细解读了《JavaScript高级程序设计》一书的核心概念,包括实例指针、原型链和自定义类型创建等关键知识点,并通过代码示例展示了工厂模式、构造函数模式、对象原型模式及它们的组合应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料依旧《JavaScript高级程序设计》,不得不说这本书写的太好了,讲的极为清晰凝练,好书!

先给出重点笔记,好好理解下面的三条笔记,每一句话都很重要:

1.实例的指针仅指向原型,而不指向构造函数
可以随时为原型添加属性和方法,并且修改能够立刻在所有对象实例中表现出来,但如果重写整个原型对象,那么情况就不一样了。调用构造函数是会为实例添加一个指向最初原型的_proto_指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。
2.我们不推荐在产品化的程序中修改原生对象的原型。
3.创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式。构造函数模式用来定义实例属性,而原型模式用来定义方法和共享属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用最大限度的节省了内存(因为函数也是对象)。另外,这种混成模式还支持向构造函数传递参数,可谓是集两种模式之长

下面的代码给出了四种构建方法的demo(寄生虫模式和稳妥模式未录入)

1.工厂模式

2.构造函数

3.对象原型

4.构造函数和对象原型组合模式

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8 <script language="JavaScript">
 9 //    初试对象
10 //    var person = new Object();
11 //    person.name = "Nicholas";
12 //    person.age = 29;
13 //    person.job = "Software Engineer";
14 //
15 //    person.sayName = function(){
16 //        alert(this.name);
17 //    };
18 //
19 //    person.sayName();
20 
21 //    工厂模式
22 //    function createPerson(name,age,job){
23 //        var o = new Object();
24 //        o.name = name;
25 //        o.age = age;
26 //        o.job = job;
27 //        o.sayName = function(){
28 //            alert(this.name);
29 //        };
30 //        return o;
31 //    }
32 //
33 //    var person1=createPerson("Nicholas",29,"Softwar Enginner");
34 //    var person2=createPerson("Greg",27,"Doctor");
35 //    person1.sayName();
36 //    person2.sayName();
37 
38 //    构造函数模式
39 //    由于工厂模式,可以讲实例表示为一种特定的类型
40 //    function Person(name,age,job) {//按照惯例应大写构造函数的首字母,当然,小写也可以运行
41 //        this.name = name;
42 //        this.age = age;
43 //        this.job = job;
44 //        this.sayName = function(){//sayName后面为什么不加括号?
45 //            alert(this.name);
46 //        };
47 //    }
48 //    var person1 = new Person("Nicholas",29,"Software Enginner");
49 //    var person2 = new Person("Geeg",27,"Doctor");
50 //
51 //    person1.sayName();
52 //    person2.sayName();
53 //    alert(person1 instanceof Person);
54 //    alert(person2 instanceof Person);
55 //    alert(person1 instanceof Object);
56 //    alert(person2 instanceof Object);
57 //    Person("zhouge",21,"Studet");
58 //    window.sayName();
59 //    var o = new Object();
60 //    Person.call(o,"xiaoli",55,"singer");
61 //    o.sayName();
62 //    组合使用构造函数模式和原型模式
63     function Person(name,age,job){
64         this.name=name;
65         this.age=age;
66         this.job=job;
67         this.friends=["Shelby","Court"];
68     }
69 
70     Person.prototype={
71         constructor:Person,
72         sayName:function(){
73             alert(this.name);
74         }
75     }
76 
77     var person1=new Person("li",22,"SE");
78     var person2=new Person("zhang",23,"CS");
79     person1.friends.push("Van");
80     alert(person1.friends);
81     alert(person2.friends);
82     alert(person1.friends=== person2.friends);
83     alert(person1.sayName === person2.sayName);
84 </script>
85 </body>
86 </html>

 

转载于:https://www.cnblogs.com/yueyanglou/p/4588711.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值