Javascript进修之建立对象

在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'
    原文作者:krew
    原文地址: https://segmentfault.com/a/1190000009015821
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞