zoukankan      html  css  js  c++  java
  • 作用域链和原型链描述javaScript访问变量和属性的顺序

    一、作用域链

    Javascript引擎在执行环境对象中访问作用域内的变量,查找的顺序叫做作用域链

    1.作用域链示例:

     每次调用,regular_joe在作用域内都有定义

    //在全局作用域里,设置regular_joe
    var regular_joe = "I am here to save the day!";
    //调用作用域:全局。作用域链中的最近匹配:全局的regular_joe
    //logs 'I am here to save the day!'
    console.log(regular_joe);
    function supermax(){
      var regular_joe = 'regular_joe is assigned';
      //调用作用域:全局->supermax()。
      //作用域链中的最近匹配:在supermax()中定义的regular_joe
      //logs 'regular_joe is assigned'
      console.log(regular_joe);
    
      function prison () {
        //在javascript中,当变量被声明时,声明会被提升到它所在函数的顶部,
        //并被赋予undefined值
        var regular_joe;
        //调用作用域:全局->supermax()->person()。
        //作用域链中的最近匹配:在person()中定义的regular_joe
        console.log(regular_joe);
      }
      //执行person()函数, 'logs' 
      prison();
    }
    supermax();
    

     二、原型链

    多个对象基于类和原型的比较

    基于类的

    //step 1: defined class
    public class Prisoner {
      public int sentence = 4;
      public int probation = 2;
      public string name;
      public string id;
    //step 2: defined class struct function
      public Prisoner( string name,string id) {
        this.name = name;
        this.id = id;
      }
    }
    //step 3  实例化对象
    Personer firstPrisoner = new Prisoner("Joe","12A");
    Personer SecondPrisoner = new Prisoner("Sam","2BC");
    

     基于原型的

    //1.定义原型的对象
    var proto = {
      sentence : 4,
      probation : 2
    };
    //2.定义对象的构造函数
    var Prisoner = function(name, id){
      this.name = name;
      this.id = id;
    };
    //3.将构造函数关联到原型
    Prisoner.prototype = proto;
    //4.实例化对象
    //使用 Object.create 的常见工厂模式是使用工厂函数来创建并返回最终的对象
    //所有的工厂函数我们以make<object_name>的形式进行命名
    var makePrisoner = function( name, id ) {
      var prisoner = Object.create( proto );
      prisoner.name = name;
      prisoner.id = id;
      return prisoner;
    };
    
    var firstPrisoner = makePrisoner( 'Joe', '12A' );
    var secondPrisoner = makePrisoner( 'Sam', '2BC' );
    

     说明了javascript是如何使用原型来创建共享相同属性的对象

  • 相关阅读:
    导入别人的flex项目出现的问题
    HTTP通信原理
    java 代码的细节优化
    跨服务器之间的session共享
    spring整合hibernate配置文件
    java中时间类型的问题
    Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:
    并发处理方案 个人总结
    MsSqlserver 查看锁表与解锁
    c# CTS 基础数据类型笔记
  • 原文地址:https://www.cnblogs.com/nodejsxxh/p/4418976.html
Copyright © 2011-2022 走看看