JavaScript中创建对象过程的理解

来源:互联网 发布:英制螺丝孔算法 编辑:程序博客网 时间:2024/05/22 05:29

JavaScript设计基础

  • JavaScript是完全不同于其他OO语言设计思路的一门脚本语言。
  • 其核心思想是:函数就是对象,对象中可以有属性与函数,其中属性与函数都有一个名字,名字类似指针,存着指向值的地址。没有OO中类的概念
  • 正是其独特的基础核心思想,决定了这门语言的很多设计特点,在过程中把函数和指针用得透透的,从而引申出很多独特的(可以说复杂麻烦)的特性
  • 一门语言的基础思想决定了这门语言的语言细节的走向与相应应用程序的编写思路。

JavaScript创建对象

工厂模式

function createPerson(name, age){    var o = new Object();    o.name = name;    o.age = age;    o.getName = function(){        return this.name;    };    return o;}var person1 = createPerson("XiaoMing", 24);
  • 特点:
    • 不同实例上的同名函数不相等(不是同一个函数对象,如getName对不同实例指向不同对象)
    • 不能解决对象识别问题,不能通过 instanceof 来判断实例的类型

稳妥构造函数模式

因为这个构造模式与工厂模式极为相似,同时《JavaScript高级程序设计》中并没有细说两者的区别,因此尤其先将该构造函数模式列在工厂模式下方,以区别。

function createPerson(name, age){    var o = new Object();    var _name = name;  //此处name属性并没有挂在o对象下,只有这样才能确保外部不能访问该属性    var _age = age;    o.getName = function(){        return _name;    };    return o;}var person1 = createPerson("XiaoMing", 24);
  • 特点:其内部含有私有变量,外部不能通过实例访问到对应的私有属性,因为构造函数中的私有属性并没有挂在对应实例上。

构造函数模式

function Person(name, age){    this.name = name;    this.age = age;    this.getName = function(){        return this.name;    };}var person1 = new Person("XiaoMing", 24);//将该构造函数作为普通函数调用, this 的值全部添加到 Global 对象的属性中var o = new Object();Person.call(o, 'XiaoMing', 24);
  • 特点:
    • 可以使用 instanceof 来判断实例的类型, person1 instanceof Person
    • 每个方法都要在每个实例上重新创建一遍
    • 任何函数只要是通过 new 调用的,就可以作为构造函数,若不通过 new 调用,则只是普通函数。

原型与构造函数组合使用

function Person(name, age){    this.name = name;    this.age = age;}Person.prototype = {    constructor : Person, //使用对象字面量语法重写prototype时需要重新指定 constructor 的指向    sayName : function(){        return this.name;    }};var person1 = new Person("XiaoMing", 24);
  • 特点:
    • 所有实例都共享定义在原型中的属性或函数。
    • 实例中存在指向原型的指针,若在创建实例后将类型的原型更新为新原型,则旧实例将丢失与新原型之间的关联
    • 为对象实例添加一个属性时,这个属性会屏蔽源性对象中保存的同名属性
    • 读取对象实例中某个属性时,首先在实例本身中寻找属性,再搜索指针指向的原型对象
  • 判断属性是否是原型对象中共享的属性
    • in 操作符只要能够通过对象实例访问到属性就会返回 true
    • hasOwnPeoperty() 则只有当属性存在于实例中时才会返回 true
function hasPropotypeProperty(object, name){    return !object.hasOwnProperty(name) && (name in object);}
0 0
原创粉丝点击