zoukankan      html  css  js  c++  java
  • JS----创建对象

    有关this指向问题:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。
    对于构造函数: 如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
    参考学习:https://www.cnblogs.com/juggdxy/p/8245491.html
    创建对象的六种方式:

    1.字面量创建
    2.new object()创建
    3.工厂模式
    4.构造函数模式
    5.原型模式
    6.混合模式
    

    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("lisi", 29 , "teacher");
     var person2 = createPerson("zhagnsna", 34,"doctor");
    

    4.构造函数模式:

    function Person(name,age,job) {
        this.name=name;
        this.age=age;
        this.job=job;
        this.sayName=function () {
           alert(this.name);
        }
     }
    
    var person1=new Person('zhy',18,'SoftWare Engineer');
    var person2=new Person('zhy2',19,'Doctor');
    
    

    要创建Person的新实例,必须使用new操作符。如果不使用new,则属性和方法都被添加给了window对象了。
    这种方式调用构造函数实际上会经历一下4个步骤:

    1. 创建一个新对象;
    2. 将构造函数的作用域赋给新对象,因此,this就指向了这个新对象;
    3. 执行构造函数中的代码,即为这个新对象添加属性、方法;
    4. .返回新对象。

    5.原型模式

    function Person() {
    }
    
    Person.prototype.name = "lisi";
    Person.prototype.age = 21;
    Person.prototype.family = ["lida","lier","wangwu"];
    Person.prototype.say = function(){
        alert(this.name);
    };
    console.log(Person.prototype);   //Object{name: 'lisi', age: 21, family: Array[3]}
    
    var person1 = new Person();        //创建一个实例person1
    console.log(person1.name);        //lisi
    
    var person2 = new Person();        //创建实例person2
    person2.name = "wangwu";
    person2.family = ["lida","lier","lisi"];
    console.log(person2);            //Person {name: "wangwu", family: Array[3]}
    // console.log(person2.prototype.name);         //报错
    console.log(person2.age);              //21
    

    6.混合模式

    function Person(name,age,family){
        this.name = name;
        this.age = age;
        this.family = family;
    }
    
    Person.prototype = {
        constructor: Person,  //每个函数都有prototype属性,指向该函数原型对象,原型对象都有constructor属性,这是一个指向prototype属性所在函数的指针
        say: function(){
            alert(this.name);
        }
    }
    
    var person1 = new Person("lisi",21,["lida","lier","wangwu"]);
    console.log(person1);
    var person2 = new Person("wangwu",21,["lida","lier","lisi"]);
    console.log(person2);
    

    分割线==================================================================
    创建函数 ,就会创建一个prototype属性,指向原型对象,原型对象都会自动获得一个constructor属性,这个属性是指向prototype属性所在函数的指针。
    调用构造函数创建新实例,新实例内部将包含一个指针,指向构造函数的原型对象。

    alert(Person.prototype.isPrototypeOf(person1));

    alert(Object.getPrototypeOf(person1) == Person.prototype);

    alert(person2.hasOwnProperty(“name”)); 如果是·实例属性返回true,若来自原型则返回false。
    in 操作符·会在通过·对象能够·访问给定属性时返回true。
    同时使用hasOwnProperty和in操作符可以确定属性是存在对象中还是原型中。

  • 相关阅读:
    cnpm 安装和 command not found
    C#-弄懂泛型和协变、逆变
    2019年阅读
    ES5和ES6数组方法
    ASP.NET MVC中的捆绑和压缩技术
    markdown解析与着色
    Oauth2.0
    同源策略和跨域的解决方案
    windows常用命令
    Java 9 在win10环境搭建
  • 原文地址:https://www.cnblogs.com/princeness/p/11664985.html
Copyright © 2011-2022 走看看