zoukankan      html  css  js  c++  java
  • javascript继承(一)—类的属性研究

        本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很多名字,例于原型对象,构造函数等,它们都是指javascript中的类。例如:function Person(){} var p = new Person(); 这里的Person可以看作一个类,而p则是这个类的实例也可以称为对象。

        这里主要分析js里面的四种属性。

        私有属性,指定义在类中用var声明的,即var propertyName = sonmeValue,只能在这个类里面进行访问,不能被继承,也不能在原型方法中访问的属性。
        特权属性(实例属性),指在类中或者说在构造函数中(js里是同一个东西),使用this关键字,即this.propertyName = someValue,该属性在类中可以访问,在原型方法中可以访问,在该类的对象中也 能被访问,甚至用call或apply继承时也能访问。
      共有属性,指通过ClassName.prototype.propertyName=someValue 来定义的,如果该属性在类中没定义,即没有重命的特权属性,则可以当特权属性被访问,即能在对象中调用,通过prototype继承的子类也能访问。
        静态属性,直接ClassName.propertyName=someValue 来定义,相当于一个命名空间,在类的内部外部都能访问。

    例1: 各种属性定义

    function Person(){
         var private_name = "小明"; //私有属性
         var private_age = 10; //私有属性
         this.privilege_name = "小红"; //特权属性
         this.privilege_age = 9; //特权属性
      }
        Person.prototype.public_name = "小芳"; //公有属性
        Person.prototype.public_age =8; //共有属性
        Person.static_name = "小李"; //静态属性
        Person.static_age = 7; //静态属性
     
        var pp = new Person();
        pp.name = '小王'; //静态属性
        pp.age = 6; //静态属性

    在这个例子里指出了这四种属性的定义方式。注意静态属性里,因为Person和pp都是Object实例,如下面代码执行结果可以看出。

    console.log(Person instanceof Object,pp instanceof Object); //true true

    所以都可以定义静态属性。

    下面来分析一下这些属性的访问权限。

    例2:各种属性的访问权限 

    function Person(){
        var private_name = '小明';
        var private_age = 10;    
     this.privilege_name = '小红'; 
     this.privilege_age = 9; 
     
        //定义一个特权方法
     this.showPrivilegeName = function(){
        console.log(private_name);             // private_name is not defined .说明私有属性可以在特权方法中访问.
        console.log(this.privilege_name );         //输出:"小红"。说明特权属性可以在特权方法中访问
        console.log(this.public_name);            //输出:"小芳"。说明共有属性可以在特权方法中访问
        console.log(Person.static_name);        //输出:"小李"。说明类的静态属性可以在特权方法中访问
      }
    }
     
    Person.prototype.public_name = '小芳';
    Person.prototype.public_age =8;   
    Person.static_name = '小李';   
    Person.static_age = 7;    
    var pp = new Person();
    pp.name = '小王';       
    pp.age = 6;
     
    //定义一个原型方法
    Person.prototype.showName = function(){
      //console.log(private_name);         // private_name is not defined .说明私有属性不能在原型方法中访问.
      console.log(this.privilege_name );         //输出:"小红"。说明特权属性可以在原型方法中访问
      console.log(this.public_name);        //输出:"小芳"。说明共有属性可以在原型方法中访问
      console.log(Person.static_name);        //输出:"小李"。说明类的静态属性可以在原型方法中访问
    }   
     
    pp.showPrivilegeName();
    pp.showName();
    console.log(pp.private_name);            //undefined 私有属性不能在实例化的对象中访问 
    console.log(pp.privilege_name );         //输出:"小红"。说明特权属性可以在原型方法中访问
    console.log(pp.public_name);            //输出:"小芳"。说明共有属性可以在原型方法中访问
    console.log(Person.static_name);        //输出:"小李"。说明类的静态属性可以在原型方法中访问
    console.log(pp.name);                 //输出:"小王"。说明实例对象的静态属性可以在原型方法中访问

    可以看到如果特权属性和公共属性重名的话,访问特权属性,如果特权属性不存在的话则访问共有属性。 另外如果用delete对象的属性删掉是删的特权属性,删除后可以继续访问共有属性。 对于对象的静态属性只能该对象能访问,类的其它对象是不能访问的。

    例3:特权属性和对象静态属性之间的优先级问题

    function Person(){
      this.name = '小李';
    }
    var p1 = new Person();
    p1.name = '小红';
    p1.age = 10
    console.log(p1.name); //小红
    console.log(p1.age); //10
    delete p1.name
    console.log(p1.name); //undefined
    

    例4特权属性和对象静态属性之间的优先级问题

    function Person(){ 
    this.name = '小李'; 
    } 
    var p1 = new Person(); 
    p1.name = '小红'; 
    p1.age = 10 
    console.log(p1.name); //小红 console.log(p1.age); //10 delete p1.name console.log(p1.name); //undefined

    可以看到如果创建了对象后,给该对象创建一个与特权属性同名的静态属性,特权属性的值会被覆盖,如果用delete删除后,再访问为undefined。

    总结:对象的静态属性只能该对象本身能访问,优先级:对象的静态属性>类的特权属性>共有属性。其中对象的静态属性会覆盖类的特权属性,而类的特权属性并不会覆盖共有属性,即用delete删除该对象的属性是删除它的特权属性,并不能删除类的共有属性。 
    对于类静态属性和方法,是到处都能访问的,即相当于命名空间。
    对于类的共有属性,特权属性在外部是可以访问的。
    对于私有属性和方法,只有类的内部能使用。其中类的共有属性和方法可以访问类的特权属性和方法,但不能访问类的私有属性和方法。
  • 相关阅读:
    C# 利用TTS实现文本转语音
    Windows10提示“没有权限使用网络资源”的解决方案
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    phpfpm的配置
    session 的工作原理
    MySQL 事务
    Redis各种数据类型的使用场景
    JavaScript 和Ajax跨域问题
    如何做URL静态化 和页面的静态化
  • 原文地址:https://www.cnblogs.com/lj915/p/3780110.html
Copyright © 2011-2022 走看看