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

    6.创建对象

    6.1 对象创建方式

    6.1.1 工厂模式

           Function createPerson(name,age){

                  Var  o = new Object();

                  o.name = name;

                  o.age = age;

                  return o;

    }

    缺点:没有解决对象识别问题

    6.1.2 构造函数模式

    Function Person(name.age){

           This.name = name;

    This.age = age;

    This.sayName = function(){

           Alert(this.name);

    }

    }

    Var person1 = new Person(“jim”,12);以这种方式调用构造函数会经历一下4个步骤:

    1.创建一个对象

    2.将构造函数的作用域赋给新对象(此时的this指向这个新对象)

    3.执行构造函数中的代码(为这个新对象添加属性)

    4.返回新对象

    缺点:每个方法都要在每个实例上重新创建一遍

    6.1.3 原型模式

    Function Person(){

    }

    Person.prototype.name = “jim”;

    Person.prototype.age = 12;

    Person.prototype.sayName = function(){

           Alert(this.name);

    }

    Var person1 = new Person();

    Person1.sayName();

    优点:所有的属性和方法被实例共享

    缺点:新对象会具有相同的属性和方法

    6.1.3.1原型对象

    只要创建一个新函数,该函数就会创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所以原型对象都会自动获得一个constructor属性,这个属性指向具有prototype属性的函数。当调用这个构造函数创建一个新实例后,这个实例包含一个指针[[prototype]],执行构造函数的原型对象。

    原型.isPrototypeOf(实例);//返回布尔型

    Object.getPrototypeOf(实例)//返回原型

    每当代码读取某对象的属性时,都会执行一次搜索。搜索首先从对象实例本身开始。如果在实例中找到具有给定名字的属性,则返回该属性的值。如果没有找到,则继续搜索指针指向的原型对象。

    虽然可以通过对象实例访问保存在原型中的值,但是不能通过实例重写原型中的值。

    实例.hasOwnProperty(属性名);  //检测属性是存在原型还是存在实例中,当存在实例中返回true

     

    6.1.3.2简化后的原型模式

    Function Person(){

    }

    Person.prototype = {

           name : “jin”,

           age : 45,

           sayName : function(){

                  alert(this.name);

    }

    }

    Var person1 = new Person();

    Person1.sayName();

    此时对象字面量重写了整个原型对象,那么这个原型的constructor不在指向Person。

    6.1.3.3原型的动态性

    对原型的修改能够立即从实例上体现出来。但是如果对整个原型做修改,即重写原型,那情况就不一样了。例如,先创建一个实例,在重写整个原型对象,name会出错。

    6.1.3.4 原生对象的原型

    可以对原生对象的原型,添加方法。

    6.1.4 组合使用构造函数模式和原型模式

    Function Person(name,age){

           This.name = name;

    This.age = age;

    }

    Person.prototype.sayName = function(){

           Alert(this.name);

    }

    6.2 定义对象属性

    属性可以动态添加。对象属性分为公有的和私有的。

    任何函数里面定义的变量都是私有的,外部不能访问这些变量。Js构造函数就是一个函数,因此可以在里面定义私有属性。

    闭包通过自己的作用域链可以访问这些私有变量。

    特权方法:有权访问私有变量和私有函数的公有方法。

    1)私有属性

    私有属性只能在构造函数内部定义与使用。

    语法格式:var propertyName=value;

    例如:function User(age){

               this.age=age;

               var isChild=age<12;

               this.isLittleChild=isChild;

        }

        var user=new User(15);

        alert(user.isLittleChild);//正确的方式

    alert(user.isChild);//报错:对象不支持此属性或方法

    2)公有属性

    prototype方式,语法格式:functionName.prototype.propertyName=value

    this方式,语法格式:this.propertyName=value,注意后面例子中this使用的位置

    6.3 定义对象方法

    方法可以动态添加。对象函数分为公有的和私有的。

    任何函数里面定义的函数都是私有的,外部不能访问这些函数。Js构造函数就是一个函数,因此可以在里面定义私有方法。

    闭包通过自己的作用域链可以访问这些私有函数。

    1)  私有方法

    私有方法必须在构造函数体内定义,而且只能在构造函数体内使用。

    语法格式:function methodName(arg1,…,argN){ }

    例如:

    function User(name){

              this.name=name;

              function getNameLength(nameStr){

                  return nameStr.length;

              }

              this.nameLength=getNameLength(this.name);  

        }

    2)  公有方法

    prototype方式,在构造函数外定义,语法格式:

    functionName.prototype.methodName=method;

    this方式,在构造函数内部定义,语法格式:

    this.methodName=method;

    例如:

    function User(name){

           this.name=name;

           this.getName=function(){

                   return this.name;

           };

    User.prototype.getName= function(newName){

                   this.name=newName;

           };

  • 相关阅读:
    03 Zabbix常用的术语
    01 Zabbix采集数据方式
    自学Zabbix13.1 分布式监控proxy介绍
    自学Zabbix12.5 Zabbix命令-zabbix_proxy
    自学Zabbix12.4 Zabbix命令-zabbix_sender
    自学Zabbix12.3 Zabbix命令-zabbix_agentd
    自学Zabbix12.2 Zabbix命令-zabbix_get
    自学Zabbix12.1 Zabbix命令-zabbix_server
    自学Zabbix11.6 Zabbix SNMP自定义OID
    自学Zabbix11.5 Zabbix SNMP监控实例
  • 原文地址:https://www.cnblogs.com/qduanlu/p/2818113.html
Copyright © 2011-2022 走看看