码迷,mamicode.com
首页 > 编程语言 > 详细

探索javascirpt-原型与原型链

时间:2015-03-31 17:18:01      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

javascript使用原型链来解析属性值(很相似于使用作用域链来解析变量)

 

原型链是往"内部"找

作用域链是往“外部”找

 

使用Object.create()和工厂函数 取代 new(虽然现在new用的最多,大多数库源代码都是用new的方式来创建对象的,但毕竟javascirpt是原型继承,所以隐藏oop的new)

Object.create仅支持ie9+,

所以要做兼容性判断

var objectCreate = function(arg) {

  if(!arg) { return {};}

  function obj(){};

  obj.prototype = arg;

  return new obj;

}

Object.create = Object.create || objectCreate ;//这是一种很常用的修复兼容性和检测库是否重复加载的方式

 

谈谈执行环境

  执行环境是函数被调用执行时才建立的,而作用域是根据代码结构来定去区分的,不管函数赋值到哪去,(可以大概认为定义函数时函数就在内存中的一段地址,变量都是引用,无法改变其地址,所以作用域都是一样的)

  但执行环境一个特有的变量就是this,this是根据执行环境要确定它是指向那个对象。

  执行环境执行过程大致分为两轮,

  1:声明参数并赋值

  2:声明局部变量但不赋值

  3:声明函数并且赋值,但不执行(其优先级大于2)

 

模块模式-将私有变量引入

  //其中也有一点,函数也是对象,所以函数的某些定义对象也所以,例如作用域,准确来说我认为作用域是按对象来划分的

 

var me = (function() {

    var name = "jack",

      jjLength = 18;

    return {

      yetName: function() {

        console.log(name);

      },

      yetJJ : function() {

        console.log(jjLength);

      }

    }

  })();

  me.yetName();//jack

  作为匿名自执行函数,执行完一次之后便结束,

  里面的变量就永远都不会更新,除非你定义了set方法

  还有一点很关键,函数和对象的赋值都是引用赋值,二基础变量是值传递。(也可以这样说,复杂数据类型是引用传递,基础数据类型是值传递)

  这里代码可以解释:

  

var a = {
	bb : ‘3‘,
	cc : function() {
		console.log(this.bb);
	}
}

a.cc();//3
var b = a;
var bbb = a.bb;
b.bb = ‘2333‘;
a.cc();//2333
console.log(bbb);//3

  

谈谈闭包

  就我而言看了很多书,当讲起闭包的概念的时候,没几本书能彻底的解释,例如”闭包是让内部函数能访问外部函数的变量的特性还是xxxxbalabala“,反正都不懂

  但我曾看到一个最好的解释是:

  闭包是阻止javascirpt垃圾回收器将变量从内存中移除的方法,使得在创建变量的执行环境的外面能访问到该变量。(虽然我一直吐槽为何叫做“闭包”,暂时还不懂命名的意义)

探索javascirpt-原型与原型链

标签:

原文地址:http://www.cnblogs.com/WJ-yellow/p/4381308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!