Skip to content

Commit 87e974f

Browse files
设计模式 init
1 parent 0475c4c commit 87e974f

32 files changed

+5684
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+

2+
<script type="text/javascript">
3+
var duck = {
4+
duckSinging: function(){
5+
console.log( '嘎嘎嘎' );
6+
}
7+
};
8+
9+
var chicken = {
10+
duckSinging: function(){
11+
console.log( '嘎嘎嘎' );
12+
}
13+
};
14+
15+
var choir = []; // 合唱团
16+
var joinChoir = function( animal ){
17+
if ( animal && typeof animal.duckSinging === 'function' ){
18+
choir.push( animal );
19+
console.log( '恭喜加入合唱团' );
20+
console.log( '合唱团已有成员数量:' + choir.length );
21+
}
22+
};
23+
24+
joinChoir( duck ); // 恭喜加入合唱团
25+
joinChoir( chicken ); // 恭喜加入合唱团
26+
27+
</script>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script type="text/javascript">
2+
3+
var makeSound = function( animal ){
4+
if ( animal instanceof Duck ){
5+
console.log( '嘎嘎嘎' );
6+
}else if ( animal instanceof Chicken ){
7+
console.log( '咯咯咯' );
8+
}
9+
};
10+
11+
var Duck = function(){};
12+
var Chicken = function(){};
13+
14+
makeSound( new Duck() ); // 嘎嘎嘎
15+
makeSound( new Chicken() ); // 咯咯咯
16+
17+
</script>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<script type="text/javascript">
2+
3+
var makeSound = function( animal ){
4+
animal.sound();
5+
};
6+
7+
var Duck = function(){};
8+
9+
Duck.prototype.sound = function(){
10+
console.log( '嘎嘎嘎' );
11+
};
12+
13+
var Chicken = function(){};
14+
15+
Chicken.prototype.sound = function(){
16+
console.log( '咯咯咯' );
17+
};
18+
19+
makeSound( new Duck() ); // 嘎嘎嘎
20+
makeSound( new Chicken() ); // 咯咯咯
21+
22+
var Dog = function(){};
23+
24+
Dog.prototype.sound = function(){
25+
console.log( '汪汪汪' );
26+
};
27+
28+
makeSound( new Dog() ); // 汪汪汪
29+
30+
</script>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+

2+
<script type="text/javascript">
3+
4+
var googleMap = {
5+
show: function(){
6+
console.log( '开始渲染谷歌地图' );
7+
}
8+
};
9+
10+
var renderMap = function(){
11+
googleMap.show();
12+
};
13+
14+
renderMap(); // 输出:开始渲染谷歌地图
15+
16+
var googleMap = {
17+
show: function(){
18+
console.log( '开始渲染谷歌地图' );
19+
}
20+
};
21+
22+
var baiduMap = {
23+
show: function(){
24+
console.log( '开始渲染百度地图' );
25+
}
26+
};
27+
28+
var renderMap = function( type ){
29+
if ( type === 'google' ){
30+
googleMap.show();
31+
}else if ( type === 'baidu' ){
32+
baiduMap.show();
33+
}
34+
};
35+
36+
renderMap( 'google' ); // 输出:开始渲染谷歌地图
37+
renderMap( 'baidu' ); // 输出:开始渲染百度地图
38+
39+
var renderMap = function( map ){
40+
if ( map.show instanceof Function ){
41+
map.show();
42+
}
43+
};
44+
45+
renderMap( googleMap ); // 输出:开始渲染谷歌地图
46+
renderMap( baiduMap ); // 输出:开始渲染百度地图
47+
48+
var sosoMap = {
49+
show: function(){
50+
console.log( '开始渲染搜搜地图' );
51+
}
52+
};
53+
54+
renderMap( sosoMap ); // 输出:开始渲染搜搜地图
55+
56+
</script>

7 设计模式/1/1.3.1 封装.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script type="text/javascript">
2+
3+
var myObject = (function(){
4+
var __name = 'sven'; // 私有(private)变量
5+
return {
6+
getName: function(){ // 公开(public)方法
7+
return __name;
8+
}
9+
}
10+
})();
11+
12+
console.log( myObject.getName() ); // 输出:sven
13+
console.log( myObject.__name ) // 输出:undefined
14+
15+
</script>

7 设计模式/1/1.4.1.html

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<script type="text/javascript">
2+
3+
var Plane = function(){
4+
this.blood = 100;
5+
this.attackLevel = 1;
6+
this.defenseLevel = 1;
7+
};
8+
9+
var plane = new Plane();
10+
plane.blood = 500;
11+
plane.attackLevel = 10;
12+
plane.defenseLevel = 7;
13+
14+
var clonePlane = Object.create( plane );
15+
console.log( clonePlane ); // 输出:Object {blood: 500, attackLevel: 10, defenseLevel: 7}
16+
17+
//在不支持Object.create 方法的浏览器中,则可以使用以下代码:
18+
Object.create = Object.create || function( obj ){
19+
var F = function(){};
20+
F.prototype = obj;
21+
return new F();
22+
}
23+
24+
</script>

7 设计模式/1/1.4.2.html

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<script type="text/javascript">
2+
3+
'use strict'
4+
5+
var obj1 = new Object();
6+
var obj2 = {};
7+
8+
console.log( Object.getPrototypeOf( obj1 ) === Object.prototype ); // 输出:true
9+
console.log( Object.getPrototypeOf( obj2 ) === Object.prototype ); // 输出:true
10+
11+
12+
//再来看看如何用new 运算符从构造器中得到一个对象,下面的代码我们再熟悉不过了:
13+
function Person( name ){
14+
this.name = name;
15+
};
16+
17+
Person.prototype.getName = function(){
18+
return this.name;
19+
};
20+
21+
var a = new Person( 'sven' )
22+
console.log( a.name ); // 输出:sven
23+
console.log( a.getName() ); // 输出:sven
24+
console.log( Object.getPrototypeOf( a ) === Person.prototype ); // 输出:true
25+
26+
//在Chrome 和Firefox 等向外暴露了对象__proto__属性的浏览器下,我们可以通过下面这段代码来理解new 运算的过程:
27+
function Person( name ){
28+
this.name = name;
29+
};
30+
31+
Person.prototype.getName = function(){
32+
return this.name;
33+
};
34+
35+
var objectFactory = function(){
36+
var obj = new Object(), // 从Object.prototype 上克隆一个空的对象
37+
Constructor = [].shift.call( arguments ); // 取得外部传入的构造器,此例是Person
38+
obj.__proto__ = Constructor.prototype; // 指向正确的原型
39+
var ret = Constructor.apply( obj, arguments ); // 借用外部传入的构造器给obj 设置属性
40+
return typeof ret === 'object' ? ret : obj; // 确保构造器总是会返回一个对象
41+
};
42+
43+
var a = objectFactory( Person, 'sven' );
44+
45+
console.log( a.name ); // 输出:sven
46+
console.log( a.getName() ); // 输出:sven
47+
console.log( Object.getPrototypeOf( a ) === Person.prototype ); // 输出:true
48+
49+
50+
//下面的代码是我们最常用的原型继承方式:
51+
52+
var obj = { name: 'sven' };
53+
var A = function(){};
54+
A.prototype = obj;
55+
var a = new A();
56+
console.log( a.name ); // 输出:sven
57+
58+
//当我们期望得到一个“类”继承自另外一个“类”的效果时,往往会用下面的代码来模拟实现:
59+
var A = function(){};
60+
A.prototype = { name: 'sven' };
61+
var B = function(){};
62+
B.prototype = new A();
63+
var b = new B();
64+
console.log( b.name ); // 输出:sven
65+
66+
//通过Class 创建对象的一段简单示例代码①如下所示 :
67+
class Animal {
68+
constructor(name) {
69+
this.name = name;
70+
}
71+
72+
getName() {
73+
return this.name;
74+
}
75+
}
76+
77+
class Dog extends Animal {
78+
constructor(name) {
79+
super(name);
80+
}
81+
speak() {
82+
return "woof";
83+
}
84+
}
85+
86+
var dog = new Dog("Scamp");
87+
console.log(dog.getName() + ' says ' + dog.speak());
88+
89+
</script>

0 commit comments

Comments
 (0)