zoukankan      html  css  js  c++  java
  • 创建对象和实例

    这里以函数为对象,创建函数和函数的实例

    方法1:早期模式

    var person = new Object();
    person.name = "Nicholas";
    person.age = 29;
    person.job = "Software Engineer";
    
    person.sayName = function() {
    alert(this.name);
    };
    
    

    方法2:对象字面量模式

    //创建函数+函数的实例
    
    var person = {
        name:"NIcholas",
        age:29,
        job: "Software Engineer",
        
        sayName: function() {
          alert(this.name);
        }
    };
    

    区别:

    • 没有用new创建对象
    • 没有“person.”表示属性的对象,而是花括号取代,表示属性对应哪个对象
    • 赋值符号由等号变成冒号

    缺点:

    • 创建多个相似对象,有代码冗余,例如创建n个相似实例, sayName方法被写n次

    方法3:工厂模式

    //创建函数
    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");
    

    说明:

    • 对象的创建程序写(封装)在函数里,解决了创建多个相似对象不冗余

    方法4:构造函数模式

    //创建函数
    function = Person(name, age, job){
        this.name = name;
        this.age = age;
        this.job = job;
        this.sayName = function() {
            alert(this.name);
        };
    }
    
    //调用函数来创建函数实例
    
    //调用方式1:看作构造函数
    var person1 = new Person{"Nicholas", 29, "Software Engineer");
    var person2 = new Person("Greg", 27, "Doctor");  //"Nicholas"
    
    //调用方式2:看作普通函数
    Person("Greg", 27, "Doctor");  //添加到window
    window.sayName();  //"Greg"
    
    //调用方式3:在另一个对象的作用域中使用
    var o = new Object();
    Person.call(o,"Kristen",25,"Nurse");
    o.sayName();  //"Kristen"
    
    

    区别:

    • Person()函数代替了createPerson()函数
    • 没有显式地创建对象
    • 直接将属性和方法赋给了this对象
    • 没有return语句
    • 函数名首字母用了大写

    说明:

    • 不同实例上的同名函数是不相等的
      alert(person1.sayName == person2.sayName); //false

    缺点:

    • 每个方法都要在每个实例上重新创建一遍。例如两个实例就创建了两个sayName()。

    方法5:原型模式

    //创建函数
    
    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"
    
    

    用于检测
    1、检测一个属性在实例还是在原型(《高程》p150-152)

    • hasOwnProperty()方法
      检查范围:实例
      属性存在对象实例中时,返回true
    • in操作符
      检查范围:实例+原型
      属性存在对象实例或原型时,返回true

    所以,同时使用hasOwnProperty()方法和in操作符,就可以确定该属性到底是存在于对象中,还是存在于原型中,如下所示

    //true=存在于原型中;false=存在于实例中
    function hasPrototypeProperty(object,name){
        return !object.hasOwnProperty(name) && (name in Object);
    }
    
    

    constructor(构造函数)属性

  • 相关阅读:
    代码品质
    窖藏好题
    最后一次模拟
    几个有意思的题目
    【数组练习】
    【复习】图论
    【复习】后缀数组
    The Usage Of Difference Table
    【复习】NTT注意事项
    CF999E Reachability from the Capital
  • 原文地址:https://www.cnblogs.com/KarmaDeng/p/7397346.html
Copyright © 2011-2022 走看看