JavaScript設(shè)計模式之構(gòu)造函數(shù)模式

作者 |?湯姆大叔
介紹
基本用法
function Car(model, year, miles) {this.model = model;this.year = year;this.miles = miles;this.output= function () {return this.model + "走了" + this.miles + "公里";};}var tom= new Car("大叔", 2009, 20000);var dudu= new Car("Dudu", 2010, 5000);console.log(tom.output());console.log(dudu.output());
function Car(model, year, miles) {this.model = model;this.year = year;this.miles = miles;this.output= formatCar;}function formatCar() {return this.model + "走了" + this.miles + "公里";}
構(gòu)造函數(shù)與原型
function Car(model, year, miles) {this.model = model;this.year = year;this.miles = miles;}/*注意:這里我們使用了Object.prototype.方法名,而不是Object.prototype主要是用來避免重寫定義原型prototype對象*/Car.prototype.output= function () {return this.model + "走了" + this.miles + "公里";};var tom = new Car("大叔", 2009, 20000);var dudu = new Car("Dudu", 2010, 5000);console.log(tom.output());console.log(dudu.output());
只能用new嗎?
function Car(model, year, miles) {this.model = model;this.year = year;this.miles = miles;// 自定義一個output輸出內(nèi)容this.output = function () {return this.model + "走了" + this.miles + "公里";}}//方法1:作為函數(shù)調(diào)用Car("大叔", 2009, 20000); //添加到window對象上console.log(window.output());//方法2:在另外一個對象的作用域內(nèi)調(diào)用var o = new Object();Car.call(o, "Dudu", 2010, 5000);console.log(o.output());
//作為函數(shù)調(diào)用var tom = Car("大叔", 2009, 20000);console.log(typeof tom); // "undefined"console.log(window.output()); // "大叔走了20000公里"
//使用new 關(guān)鍵字var tom = new Car("大叔", 2009, 20000);console.log(typeof tom); // "object"console.log(tom.output()); // "大叔走了20000公里"
強(qiáng)制使用new
function Car(model, year, miles) {if (!(this instanceof Car)) {return new Car(model, year, miles);}this.model = model;this.year = year;this.miles = miles;this.output = function () {return this.model + "走了" + this.miles + "公里";}}var tom = new Car("大叔", 2009, 20000);var dudu = Car("Dudu", 2010, 5000);console.log(typeof tom); // "object"console.log(tom.output()); // "大叔走了20000公里"console.log(typeof dudu); // "object"console.log(dudu.output()); // "Dudu走了5000公里"
原始包裝函數(shù)
// 使用原始包裝函數(shù)var s = new String("my string");var n = new Number(101);var b = new Boolean(true);// 推薦這種var s = "my string";var n = 101;var b = true;
// 原始stringvar greet = "Hello there";// 使用split()方法分割greet.split(' ')[0]; // "Hello"// 給原始類型添加新屬性不會報錯greet.smile = true;// 單沒法獲取這個值(18章ECMAScript實現(xiàn)里我們講了為什么)console.log(typeof greet.smile); // "undefined"// 原始stringvar greet = new String("Hello there");// 使用split()方法分割greet.split(' ')[0]; // "Hello"// 給包裝函數(shù)類型添加新屬性不會報錯greet.smile = true;// 可以正常訪問新屬性console.log(typeof greet.smile); // "boolean"
總結(jié)

評論
圖片
表情
