zoukankan      html  css  js  c++  java
  • javascript 之 面向对象【创建对象】

    创建对象 

        (1) 工厂模式       

    function createPerson(name, age, job){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.sayName = function(){
            alert(this.name);
        };
        return o;
    }
    var person1 = createPerson("Nicholas", 29, "Software Engineer");
    var person2 = createPerson("Greg", 27, "Doctor");
    存在的问题:没有解决对象时别问题(怎么知道一个对象的类型)

      (2)构造函数模式

          注意点:构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头

    function Person(name, age, job){
        this.name = name;
        this.age = age;
        this.job = job;
        this.sayName = function(){
            alert(this.name);
        };
    }
    与上面进行比较
    1/没有显示的创建对象
    2/直接将属性和方法赋给了this对象
    3/没有return语句
    var person1 = new Person("Nicholas", 29, "Software Engineer"); 
    var person2 = new Person("Greg", 27, "Doctor");
    创建Person新实例必须使用new操作符,对应着四个步骤
    1/创建新的对象
    2/将构造函数的作用域给新对象
    3/执行构造函数中的代码
    4/返回新对象

    //作为普通函数调用
    Person(Greg,27,Doctor)//添加到window
    window.sayName();
    //在另一个对象的作用域中调用
    var o=new Object();
    Person.call(o,Kristen,25,Nurser)
    o.sayName()

    存在的问题:每个方法都要在每个实例上重新创建一遍,person1和person2都有一个sayName()方法,但实际这两个方法不知一样的

      (3)原型模式

    每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象
    好处:可以让所有对象实例共享它所包含的属性和方法
    function Person(){ } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName(); //"Nicholas" var person2 = new Person(); person2.sayName(); //"Nicholas" alert(person1.sayName == person2.sayName); //true

    //说明:在ECMAScript新增方法Object.getPrototypeOf()

       alert(Object.getPrototypeOf(person1) == Person.prototype); //true
       alert(Object.getPrototypeOf(person1).name); //"Nicholas"

       在这里,解析器实际执行了两次搜索,第一次:person1有name属性吗,答:没有 ;第二次:person1的原型有这个属性吗,答:有。

    //若实例存在和实例原型中一样的属性同名,那么实例中的属性会屏蔽原型中的属性

    function Person(){
    }
    Person.prototype.name = "Nicholas";
    Person.prototype.age = 29;
    Person.prototype.job = "Software Engineer";
    Person.prototype.sayName = function(){
    alert(this.name);
    };
    var person1 = new Person();
    var person2 = new Person();
    person1.name = "Greg";
    alert(person1.name); //"Greg"——来自实例
    alert(person2.name); //"Nicholas"——来自原型
    delete person1.name;
    alert(person1.name); //"Nicholas" ——来自原型

    //原型与in操作符

    in操作符会在通过对象访问给定属性时返回true,无论该属性存在于实例还是原型中

    alert(person1.hasOwnProperty("name")); //false 

    alert(person1.hasPrototypeProperty("name")) // true

    alert("name" in person1); //true

    person1.name = "Greg";
    alert(person1.name); //"Greg" ——来自实例
    alert(person1.hasOwnProperty("name")); //true

    //hasOwnProperty判断是来自于原型属性时 返回false;

    //hasPrototypeProperty判断是来自于原型属性时,返回true;

  • 相关阅读:
    Delphi高手突破第二章(1),堆与栈,构造与析构函数
    终于懂了:TWinControl与TCustomControl真正区别之处(TWinControl系统自绘,TCustomControl是Delphi自绘)
    Delphi高手突破第二章(3),封装,继承,多态
    不浪费自己一点一滴精力和体力在与自己目标不相干的事情上
    Delphi高手突破第二章(2),对象大小,类方法与类引用,错误的面向对象设计
    推荐微软Windows 8 Metro应用开发虚拟实验室
    利用TCP传输协议实现基于Socket的聊天程序
    持续集成
    Android 4.1 Surface系统变化说明
    自动化测试整理 STAF/STAX & Robot Framework
  • 原文地址:https://www.cnblogs.com/zmztya/p/10101117.html
Copyright © 2011-2022 走看看