JavaScript 自学之路(二)
JavaScript
进阶: 面向对象
命名空间
var com = com || {};com.apress = com.apress || {};com.apress.chapterone = com.apress.chapterone || {};com.apress.chapterone.sectionObject = { ... };var MYAPP = {}; // the container for your applicationMYAPP.stooge = { "first-name": "Joe", "last-name": "Howard"};MYAPP.flight = { airline: "Oceanic", number: 815, departure: { IATA: "SYD", time: "2004-09-22 14:55", city: "Sydney" }, arrival: { IATA: "LAX", time: "2004-09-23 10:42", city: "Los Angeles" }};
创建对象的方法
工厂模式
function createPerson(name, age, job) { var o = new Object(); // ... return o;}
构造函数模式
function Person(name, age, job) { this.name = name; // ... this.sayName = function() { alert(this.name); };}var person1 = new Person("Nicholas", 29, "Software Engineer");
原型模式(in 操作符)
// Define a constructor called Accommodationfunction Accommodation() {}// Assign properties and methods to our "class" blueprint with an object literalAccommodation.prototype = { floors: 0, rooms: 0, sharedEntrance: false, lock: function() {}, unlock: function() {}};
组合使用构造函数模式和原型模式
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.friends = [“Shelby”, “Court”];}Person.prototype = { constructor: Person, sayName : function () { alert(this.name); }};
动态原型模式
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; //methods if (typeof this.sayName != “function”){ Person.prototype.sayName = function(){ alert(this.name); }; }}
寄生构造函数模式
function SpecialArray(){ //create the array var values = new Array(); //add the values values.push.apply(values, arguments); //assign the method values.toPipedString = function(){ return this.join(“|”); }; return values; }var colors = new SpecialArray(“red”, “blue”, “green”);alert(colors.toPipedString()); //”red|blue|green”
稳妥构造函数模式
function Person(name, age, job){ //create the object to return var o = new Object(); //optional: define private variables/functions here o.sayName = function(){ alert(name); }; return o;}
解析对象
var Person = { name: "Nicholas", age: 29, job: "Software Engineer", sayName: function(){ alert(this.name); }};var person1 = new Person();var person2 = new Person();
person1.name = "Greg"; |
 |
function Person(){}var friend = new Person();Person.prototype = { constructor: Person, name : "Nicholas", age : 29, job : "Software Engineer", sayName : function () { alert(this.name); }};
friend.sayName(); //error |
 |
属性管理器
var car = {};Object.defineProperty(car, 'doors', { configurable: true, value: 4});Object.defineProperty(car, 'wheels', { configurable: false, value: 4});delete car.doors;console.log(car.doors); // => "undefined"delete car.wheels;console.log(car.wheels); // => "4"
Object.defineProperty(car, 'doors', { writable: true, configurable: true, enumerable: true, value: 4});Object.defineProperty(car, 'wheels', { writable: true, configurable: true, enumerable: true, value: 4});Object.defineProperty(car, 'trackingEnabled', { enumerable: false, value: true});for (var x in car) { // same as console.log(Object.keys(car)); console.log(x); // output: ['doors', 'wheels']}// => ["doors", "wheels", "trackingEnabled"]console.log(Object.getOwnPropertyNames(car));console.log(car.propertyIsEnumerable('trackingEnabled')); //falseconsole.log(car.trackingEnabled); //true
Object.defineProperty(car, 'wheels', { value: 4, writable: false});car.wheels = 5;console.log(car.wheels); // => 4
({ maxwidth: 600, maxheight: 400, gimmeMax: function () { return this.maxwidth + "x" + this.maxheight; }, init: function () { console.log(this.gimmeMax()); }}).init();
继承
原型链
function SuperType(){ this.colors = [“red”, “blue”, “green”];}function SubType(){}//inherit from SuperTypeSubType.prototype = new SuperType();var instance1 = new SubType();instance1.colors.push(“black”);alert(instance1.colors); //”red,blue,green,black”var instance2 = new SubType();alert(instance2.colors); //”red,blue,green,black”
借用构造函数(伪造对象或经典继承)
function SuperType() { this.colors = [“red”, “blue”, “green”];}function SubType(){ //inherit from SuperType SuperType.call(this);} var instance1 = new SubType();instance1.colors.push(“black”);alert(instance1.colors); //”red,blue,green,black”var instance2 = new SubType();alert(instance2.colors); //”red,blue,green”
组合继承
function SuperType() { this.name = name; this.colors = [“red”, “blue”, “green”];}SuperType.prototype.sayName = function(){ alert(this.name);};function SubType(name, age){ SuperType.call(this, name); this.age = age;}SubType.prototype = new SuperType();SubType.prototype.constructor = SubType;SubType.prototype.sayAge = function(){ alert(this.age);};var instance1 = new SubType(“Nicholas”, 29);instance1.colors.push(“black”);alert(instance1.colors); //”red,blue,green,black”instance1.sayName(); //”Nicholas”;instance1.sayAge(); //29var instance2 = new SubType(“Greg”, 27);alert(instance2.colors); //”red,blue,green”instance2.sayName(); //”Greg”;instance2.sayAge(); //27
原型式继承
function object(o){ function F(){} F.prototype = o; return new F();}var person = { name: “Nicholas”, friends: [“Shelby”, “Court”, “Van”]};var anotherPerson = object(person);anotherPerson.name = “Greg”;anotherPerson.friends.push(“Rob”);var yetAnotherPerson = object(person);yetAnotherPerson.name = “Linda”;yetAnotherPerson.friends.push(“Barbie”);alert(person.friends); //”Shelby,Court,Van,Rob,Barbie”
var person = { name: “Nicholas”, friends: [“Shelby”, “Court”, “Van”]};var anotherPerson = Object.create(person, { name: { value: “Greg” }});alert(anotherPerson.name); //”Greg”
寄生式继承
function createAnother(original){ var clone = object(original); //create a new object by calling a function clone.sayHi = function(){ //augment the object in some way alert(“hi”); }; return clone; //return the object}var person = { name: “Nicholas”, friends: [“Shelby”, “Court”, “Van”]};var anotherPerson = createAnother(person);anotherPerson.sayHi(); //”hi”
寄生组合式继承
function inheritPrototype(subType, superType){ var prototype = object(superType.prototype); //create object prototype.constructor = subType; //augment object subType.prototype = prototype; //assign object}function SuperType(name){ this.name = name; this.colors = [“red”, “blue”, “green”];}SuperType.prototype.sayName = function(){ alert(this.name);};function SubType(name, age){ SuperType.call(this, name); this.age = age;}inheritPrototype(SubType, SuperType);SubType.prototype.sayAge = function(){ alert(this.age);};