在Javascript中,除了几种原始范例外,其他皆为对象(Object,Array …),既然对象云云主要,那就枚举一下在Javascript中怎样建立对象:
经由历程Object组织函数建立对象实例
var person = new Object();
person.name = 'krew';
person.age = 26;
对象字面量
对象字面量是对象定义的一种简写情势,目标在于简化建立包括大批属性的对象的历程。
var person = {
name : 'krew',
age : 26
}
工场形式
工场形式是一种设想形式,经由历程对建立详细对象的历程举行笼统。运用函数来封装建立对象的细节,能够无数次地调用用该函数,每次都能够获得包括制订内容的对象。
function personFactory(name, age){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sayName = function(){
console.log(this.name);
}
return obj;
}
var person1 = personFactory('krew', 26);
var person2 = personFactory('john', 20);
组织函数形式
基于工场形式建立对象虽然轻易,然则建立出来的对象没有特定的对象范例(比方原生对象Object, Array的实例都有本身的范例),所以就采纳组织函数形式来建立对象,就可以处理辨认对象范例的题目。
function Person(name, age){
this.name = name;
this.age = age;
this.sayName = function() {
console.log(this.name);
}
}
var person1 = new Person('krew', 26);
var person2 = new Person('john', 20);
person1.sayName(); // 'krew'
person2.sayName(); // 'john'
person1.constructor == Person // true
person2.constructor == Person // true
原型形式
每一个函数在建立的时刻,就会依据特定的规则为该函数建立一个prototype
属性,这个属性是指向函数的原型对象的指针。这个原型对象的包括能够由特定范例的一切实例同享的属性和要领。所以,在组织函数的prototype
属性上增加属性与要领,该组织函数的一切实例都会在原型链上查找到这些属性与要领。
function Person() {
}
Person.prototype.name = 'krew';
Person.prototype.age = 26;
Person.prototype.sayName = function() {
console.log(this.name);
}
var person1 = new Person();
var person2 = new Person();
person1.sayName(); // 'krew'
person2.sayName(); // 'krew'
组合组织函数和原型形式
由于原型对象中的属性是被许多实例所同享的,关于援用范例的属性值,将会存在实例间没法断绝的题目:
function Person() {
}
Person.prototype = {
constructor : Person,
name : 'krew',
age : 26,
friends : ['john', 'kitty'],
showFriends : function() {
console.log(this.friends);
}
}
var person1 = new Person();
var person2 = new Person();
person1.friends.push('petter');
person1.showFriends() // ['john', 'kitty', 'petter']
person2.showFriends() // ['john', 'kitty', 'petter']
能够看到,仅是在实例person1的friends属性上增加值,但person2也随着变化。这是由于friends数组存在于Person.prototype而非person1中,person1与person2中的friends皆为援用Person.prototype中的friends,所以当经由历程person1来转变friends的时刻,person2中的friends也会反应出来。
经由历程组合组织函数与原型形式能够处理上面涌现的题目,组织函数形式用于定义实例属性,而原型形式用于定义要领和同享的属性,每一个实例会有本身的一份实例属性,同时又同享着要领的援用,极大的节省了内存。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayName = function() {
console.log(this.name);
}
var person1 = new Person('krew', 26);
var person2 = new Person('john', 20);
person1.sayName(); // 'krew'
person2.sayName(); // 'john'
动态原型形式
function Person(name, age){
this.name = name;
this.age = age;
if (typeof this.sayName != 'function') {
Person.prototype.sayName = function() {
console.log(this.name);
}
}
}
var person1 = new Person('krew', 26);
var person2 = new Person('john', 20);
person1.sayName(); // 'krew'
person2.sayName(); // 'john'
寄生组织函数形式
function Person(name, age) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sayName = function() {
console.log(this.name);
}
return obj;
}
var person1 = new Person('krew', 26);
var person2 = new Person('john', 20);
person1.sayName(); // 'krew'
person2.sayName(); // 'john'
稳妥组织函数形式
function Person(name) {
var obj = new Object();
obj.sayName = function() {
console.log(name);
}
return obj;
}
var person1 = Person('krew');
var person2 = Person('john');
person1.sayName(); // 'krew'
person2.sayName(); // 'john'