[js] 设计模式 The Constructor Pattern (构造器模式)
基本构造器
按照惯例,构造函数以大写字母开头
//构造函数本身可不需要return,
//按照惯例的话,构造函数第一个字母大写,
//可将实例标识为特定的类型
缺点:不便于继承。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script>
function Car(model, year, miles) {
this.model = model;
this.year = year;
this.miles = miles;
//console.log(inner); //error
this.toString = function(inner) {
return this.model + " has done " + this.miles + " miles " + inner;
};
}
var civic = new Car("Honda Civic", 2009, 20000);
console.log(civic.constructor);//可以标识出它的对象类型
console.log(civic.model);
console.log(civic.year);
console.log(civic.miles);
console.log(civic.toString('inside1'));
var mondeo = new Car("Ford Mondeo", 2010, 5000);
console.log(mondeo.model);
console.log(mondeo.year);
console.log(mondeo.miles);
console.log(mondeo.toString('inside2'));
//设置属性
mondeo.model = 'abc'; //点 语法.
mondeo['year'] = 2016; //中括号 语法
Object.defineProperty(mondeo, "miles", {
value: 10086,
writable: true,
enumerable: true,
configurable: true
}); //Object.defineProperty
console.log(mondeo.model);
console.log(mondeo.year);
console.log(mondeo.miles);
Object.defineProperties(mondeo, {
"model": {
value: "Hello World",
writable: true
},
"year": {
value: 123,
writable: false
},
"miles": {
value: "321",
writable: false
}
});// Object.defineProperties
console.log(mondeo.model);
console.log(mondeo.year);
console.log(mondeo.miles);
console.log(mondeo.toString('inside2'));
</script>
</body>
</html>
实例化的多种方式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script>
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
console.log(this.name);
};
// this.sayName = sayName;
//
// function sayName() {
// console.log(this.name);
// }//本质是一样的
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.sayName(); //"Nicholas"
person2.sayName(); //"Greg"
console.log(person1 instanceof Object); //true
console.log(person1 instanceof Person); //true
console.log(person2 instanceof Object); //true
console.log(person2 instanceof Person); //true
console.log(person1.constructor == Person); //true
console.log(person2.constructor == Person); //true
console.log(person1.sayName == person2.sayName); //false
//不同实例上的同名函数式不相等的,
var person = new Person("Nicholas", 29, "Software Engineer");
person.sayName(); //"Nicholas"
Person("Greg", 27, "Doctor"); //adds to window
window.sayName(); //"Greg"
var o = new Object();
Person.call(o, "Kristen", 25, "Nurse"); //或apply() 继承?
o.sayName(); //"Kristen"
</script>
</body>
</html>
由多个实例化使用同一个方法,反复创建,引出的使用全局函数,然后又引出 使用原型的构造器
<!DOCTYPE html>
<html>
<head>
<title>Constructor Pattern Example 3</title>
<script type="text/javascript">
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName() {
console.log(this.name);
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.sayName(); //"Nicholas"
person2.sayName(); //"Greg"
console.log(person1 instanceof Object); //true
console.log(person1 instanceof Person); //true
console.log(person2 instanceof Object); //true
console.log(person2 instanceof Person); //true
console.log(person1.constructor == Person); //true
console.log(person2.constructor == Person); //true
console.log(person1.sayName == person2.sayName); //true
</script>
</head>
<body>
</body>
</html>
使用原型的构造器
缺点:?。
1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title></title> 7 </head> 8 9 <body> 10 <script> 11 function Car(model, year, miles) { 12 this.model = model; 13 this.year = year; 14 this.miles = miles; 15 //console.log(inner); //error 16 } 17 // Note here that we are using Object.prototype.newMethod rather than 18 // Object.prototype so as to avoid redefining the prototype object 19 Car.prototype.toString = function(inner) { 20 return this.model + " has done " + this.miles + " miles " + inner; 21 }; 22 // Usage: 23 var civic = new Car("Honda Civic", 2009, 20000); 24 console.log(civic.model); 25 console.log(civic.year); 26 console.log(civic.miles); 27 console.log(civic.toString('inside1')); 28 var mondeo = new Car("Ford Mondeo", 2010, 5000); 29 console.log(mondeo.model); 30 console.log(mondeo.year); 31 console.log(mondeo.miles); 32 console.log(mondeo.toString('inside2')); 33 //设置属性 34 mondeo.model = 'abc'; //点 语法. 35 mondeo['year'] = 2016; //中括号 语法 36 Object.defineProperty(mondeo, "miles", { 37 value: 10086, 38 writable: true, 39 enumerable: true, 40 configurable: true 41 }); //Object.defineProperty 42 console.log(mondeo.model); 43 console.log(mondeo.year); 44 console.log(mondeo.miles); 45 Object.defineProperties(mondeo, { 46 "model": { 47 value: "Hello World", 48 writable: true 49 }, 50 "year": { 51 value: 123, 52 writable: false 53 }, 54 "miles": { 55 value: "321", 56 writable: false 57 } 58 }); // Object.defineProperties 59 console.log(mondeo.model); 60 console.log(mondeo.year); 61 console.log(mondeo.miles); 62 console.log(mondeo.toString('inside2')); 63 </script> 64 </body> 65 66 </html>
动态原型模式
不反复重写原型
function Person(name, age, job){ //properties this.name = name; this.age = age; this.job = job; //methods if (typeof this.sayName != "function"){ Person.prototype.sayName = function(){ console.log(this.name); }; } } var friend = new Person("Nicholas", 29, "Software Engineer"); friend.sayName();
浙公网安备 33010602011771号