《JavaScript高级程序设计》之面向对象创建与继承常见模式

  1 //=================method 工厂模式================
  2 var Person = function (name, age) {
  3     var object = {};
  4
  5     object.name = name;
  6     object.age = age;
  7     object.say = function (words) {
  8         console.info(words);
  9     };
 10     object.getName = function () {
 11         console.info(this.name);
 12     };
 13
 14     return object;
 15 };
 16
 17 var person = Person(‘stone‘, 20);
 18 console.info(person.name, person.age);
 19 person.say(‘hello‘);
 20 person.getName();
 21
 22 //=================method 构造函数模式================
 23 var Person = function (name, age) {
 24     this.name = name;
 25     this.age = age;
 26     this.say = function (words) {
 27         console.info(words);
 28     };
 29 };
 30
 31 var person = new Person(‘stone‘, 20);
 32 console.info(person.name, person.age);
 33 person.say(‘hello‘);
 34
 35 var person2 = Person(‘water‘, 21);
 36 console.info(person2.name, person2.age);
 37 person2.say(‘hello‘);
 38 console.info(this.name, this.age);
 39 this.say(‘hello‘);
 40
 41 //=================method 原型模式================
 42 var Person = function () {};
 43
 44 Persion.prototype.name = ‘stone‘;
 45 Person.prototype.age = 20;
 46 Person.prototype.say = function (words) {
 47     console.info(words);
 48 };
 49
 50 var person = new Person();
 51 console.info(person.name, person.age);
 52 person.say(‘hello‘);
 53
 54 //=================method 组合模式(构造 + 原型)================
 55 var Person = function (name, age) {
 56     this.name = name;
 57     this.age = age;
 58 }
 59
 60 Person.prototype = {
 61     constructor: Person,
 62     say: function (words) {
 63         consolo.info(words);
 64     }
 65 };
 66
 67 var person = new Person(‘stone‘, 20);
 68 console.info(person.name, person.age);
 69 person.say(‘hello‘);
 70
 71 var person2 = Person(‘water‘, 21);
 72 console.info(person2.name, person2.age);
 73 person2.say(‘hello‘);
 74 console.info(this.name, this.age);
 75 this.say(‘hello‘);
 76
 77 //=================method 动态原型模式================
 78 var Person = function (name, age) {
 79     this.name = name;
 80     this.age = age;
 81
 82     if (typeof this.say != ‘function‘) {
 83         Person.prototype.say = function (words) {
 84             console.info(words);
 85         };
 86     }
 87 };
 88
 89 var person = new Person(‘stone‘, 20);
 90 person.say(‘hello‘);
 91
 92 //=================method 稳妥构造函数模式================
 93 var Person = function (name) {
 94     var o = {};
 95     o.sayName = function () {
 96         console.info(name);
 97     }
 98     return o;
 99 };
100
101 var person = new Person(‘stone‘);
102 person.sayName();
103
104
105
106 //=====================================继承==================================================//
107
108 //=================method 原型链继承================
109 var SuperType = function () {
110     this.property = true;
111 };
112
113 SuperType.prototype.getSuperValue = function () {
114     return this.property;
115 };
116
117 var SubType = function () {
118     this.subProperty = false;
119 };
120
121 SubType.prototype = new SuperType();
122
123 SubType.prototype.getSubValue = function () {
124     return this.subProperty;
125 };
126
127 //override
128 SubType.prototype.getSuperValue = function () {
129     return this.subProperty;
130 }
131
132 var instance = new SubType();
133 console.info(instance.getSuperValue());
134
135 console.info(SuperType.prototype.isPrototypeOf(instance));
136 console.info(SubType.prototype.isPrototypeOf(instance));
137 console.info(Object.prototype.isPrototypeOf(instance));
138
139 console.info(instance instanceof SuperType);
140 console.info(instance instanceof SubType);
141 console.info(instance instanceof Object);
142
143 instance.constructor == SuperType  //true
144 instance.constructor == SubType  //fasle
145
146 //=================method 借用构造函数================
147 var SuperType = function (name) {
148     this.name = name;
149 };
150
151 var SubType = function (name, age) {
152     SuperType.call(this, name);
153     this.age = age;
154 };
155
156 var instance = new SubType(‘stone‘, 20);
157 console.info(instance.name, instance.age);
158
159 //=================method 组合继承================
160 var SuperType = function (name) {
161     this.name = name;
162 };
163
164 SuperType.prototype.getName = function () {
165     return this.name;
166 };
167
168 var SubType = function (name, age) {
169     SuperType.call(this, name);
170     this.age = age;
171 };
172
173 SubType.prototype = new SuperType();
174
175 SubType.prototype.getAge = function () {
176     return this.age;
177 };
178
179 var instance = new SubType(‘stone‘, 20);
180 console.info(instance.getName(), instance.getAge());
181
182 //=================method 原型式继承================
183 function object(o) {
184     var F = function () {};
185     F.prototype = o;
186     return new F();
187 };
188
189 var person = {
190     name: ‘john‘,
191     friends: [‘van‘, ‘nicholas‘, ‘smart‘]
192 };
193
194 var anotherPerson = object(person);
195 anotherPerson.name = ‘boy‘;
196 anotherPerson.friends.push(‘hey‘);
197
198 console.info(person);
199 console.info(anotherPerson);
200
201 //=================method 寄生式继承================
202 function object(o) {
203     var F = function () {};
204     F.prototype = o;
205     return new F();
206 };
207
208 var person = {
209     name: ‘john‘,
210     friends: [‘van‘, ‘nicholas‘, ‘smart‘]
211 };
212
213 var createAnotherPerson = function (o) {
214     var clone = object(o);
215     clone.say = function () {
216         console.info(‘hello‘);
217     };
218     return clone;
219 };
220
221 var anotherPerson = createAnotherPerson(person);
222 console.info(person);
223 console.info(anotherPerson);
224
225 //=================method 寄生式组合式继承================
226
227 // var inheritPrototype = function (subType, superType) {
228     // var F = function () {};
229     // F.prototype = superType.prototype;
230     // F.constructor = subType;
231     // return new F();
232 // };
233
234 var inheritPrototype = function (subType, superType) {
235     var F = function () {};
236     F.prototype = superType.prototype;
237     var proto = new F();
238     proto.constructor = subType;
239     subType.prototype = proto;
240 };
241
242 var SuperType = function (name) {
243     this.name = name;
244 };
245
246 SuperType.prototype.getName = function () {
247     return this.name;
248 };
249
250 var SubType = function (name, age) {
251     SuperType.call(this, name);
252     this.age = age;
253 };
254
255 inheritPrototype(SubType, SuperType);
256
257 SubType.prototype.getAge = function () {
258     return this.age;
259 };
260
261 var instance = new SubType(‘stone‘, 20);
262 console.info(instance.getName(), instance.getAge());
时间: 2024-11-02 10:47:59

《JavaScript高级程序设计》之面向对象创建与继承常见模式的相关文章

javascript 高级程序设计(面向对象的程序设计) 1

Object构造函数或对象字面量都可以用来创建对象,但这些方式有个明显的缺点:使用相同一个接口创建很多对象,会产生大量重复代码. 工厂模式 //工厂模式 function createDog (name,age) { var o = new Object(); o.name = name; o.age = age; o.sayAge = function () { alert(age); }; return o; } var dog1 = createDog("Bob","1

《Javascript高级程序设计》读书笔记之继承

1.原型链继承 让构造函数的原型对象等于另一个类型的实例,利用原型让一个引用类型继承另一个引用类型的属性和方法 function SuperType() { this.property=true; } SuperType.prototype.getSuperValue=function(){ return this.property; }; function SubType() { this.subProperty=false; } //继承SuperType SubType.prototype

《JavaScript高级程序设计》学习笔记(5)——面向对象编程

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数.

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

《Javascript高级程序设计》读书笔记之对象创建

<javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决对象识别问题,所有对象都仅是Object的实例 function createPerson(name,age,job) { var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name)

javascript高级程序设计——笔记

javascript高级程序设计--笔记 基本概念 基本数据类型包括Undefined/Null/Boolean/Number和String 无须指定函数的返回值,实际上,未指定返回值的函数返回的是一个特殊的undefined值 变量.作用域和内存问题 基本类型值在内存中占据固定大小的空间,因此保存在栈内存中 引用类型的值是对象,保存在堆内存中 确定一个值是哪种基本类型用typeof,确定一个值是哪种引用用instanceof 所有变量都存在于一个执行环境当中,这个执行环境决定了变量的生命周期,

《Javascript高级程序设计》阅读记录(三):第五章 上

这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较深入,而且实际使用价值较大的内容记录下来,并且注释上我的一些想法.做这个一方面是提升了我的阅读效果以及方便我以后阅读 另一个目的是,Javascript高级程序设计这本书内容很多也很厚,希望其他没有时间的人可以通过看这系列摘录,就可以大体学到书里面的核

JavaScript高级程序设计(读书笔记)(六)

本笔记汇总了作者认为"JavaScript高级程序设计"这本书的前七章知识重点,仅供参考. 第六章 面向对象的程序设计 面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同.ECMAScript把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数."严格来讲,这就相当于说对象是一组没

《Javascript高级程序设计》阅读记录(四):第五章 下

这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较深入,而且实际使用价值较大的内容记录下来,并且注释上我的一些想法.做这个一方面是提升了我的阅读效果以及方便我以后阅读 另一个目的是,Javascript高级程序设计这本书内容很多也很厚,希望其他没有时间的人可以通过看这系列摘录,就可以大体学到书里面的核心内容. 绿色背景的内容是我认为比较值得注意的原著内容. 黄色背景的内容是我认为非常重要的原著内容. 我的理解会用蓝色的字体标示出来. 这章的内容较多,而且比较重要,分两篇