SWbeginner
SWbeginner
个人认为组件大体应该分成两类,一种是业务组件,一种是基础样式组件。样式组件肯定是要细粒度划分,最好拆分到不能再分,方便组合复用。而业务组件,肯定是方便业务上的修改,维护的,应该是包含一些基础样式组件,和一些业务逻辑代码在其中的。通俗的讲,业务组件就是一个完成品,而基础样式组件就是一个零件。
谈到作用域链,先要理解执行环境。在JS中,执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之相关联的变量对象。环境中的所有变量和函数都保存在这个对象中。 全局执行环境就是最外围的一个执行环境(比如web浏览器中的window对象),当某个执行环境中的所有代码执行完毕后,该环境与保存在其中的所有变量和函数也随之销毁。 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而函数执行之后,栈将其环境弹出,把控制权返还给之前的执行环境。 当代码在一个环境中执行时,会创建变量对象的一个作用域链(保证对执行环境有权访问的所有变量和函数的有序访问)。作用域链的最前端是当前执行代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。活动对象最开始时只包含一个变量,即argumenets对象。作用域链中下一个对量对象来自包含环境,再下一个变量对象来自下一个包含环境。一直延续到全局执行环境。这就是作用域链。 标识符解析是沿着作用域链一级一级的搜索标识符的过程,搜索过程始终从作用域链的前端开始,然后逐级向后回溯,直至找到标识符为止。
## 原型链 > 想要理解原型链,先要了解什么是原型 一、原型模式 > 我们创建的每个函数都有一个==prototype==(原型)属性,prototype属性指向原型对象。通过该函数创建的实例对象会共享原型对象上的所有属性和方法。 ``` function Person(){ } Person.prototype.name = 'test'; Person.prototype.age = 25; Person.prototype.sayName = function(){ console.log(this.name); } const person1 = new Person(); person1.sayName(); //'test' const...
1.原型链继承 主要问题是包含引用类型值的原型,会被所有实例共享,一实例修改引用类型的值(比如往数组中添加、删除元素)会在所有实例中反映出来。还有一个问题就是楼主说的无法给超类型传递参数。 2.借用构造函数 解决了原型链接继承中包含引用类型值所带来问题。也可以给超类型构造函数传递参数。但是仅仅使用借用构造函数无法避免构造函数模式存在的问题,方法都在构造函数中定义,没有函数复用。而且超类型的原型中的方法,对子类型是不可见的。 3.组合继承(常用的继承方式) 组合继承,也叫伪经典继承。是原型链和借用构造函数的组合。思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。既通过在原型上定义方法实现了函数 复用,又能够保证每个实例都有它自己的属性。 4.原型式继承 就是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。 function object(o){ function F(){} F.prototype = o; return new F(); } ES5新增的Object.create()方法就是规范化了的原型式继承函数。不过,包含引用类型值的属性始终都会共享相应的值的问题是存在的和使用原型链继承一样。 5.寄生式继承 就是在原型式继承的基础上为生成的对象再添加一些特有的方法,代码如下: function createAnother(original){ var clone = object(original); //通过调用函数创建一个新对象...