JavaScript 心灵鸡汤

来源:互联网 发布:剑三五毒捏脸数据 编辑:程序博客网 时间:2024/06/05 19:03

JavaScript相关架构源码知识总结

原型 

在我们众所周知的js框架中,原型随处可见。js不包含传统的类继承模型,而是使用prototype原型模型,接下来的js框架,包括jquery的插件源码的解读和学习中,我们也会看到原型的使用。假如你看到这篇文章,希望你对js有足够的认识。

原型链的继承方式:
function Foo() {    this.value = 42;}Foo.prototype = {    method: function() {}};function Bar() {}// 设置Bar的prototype属性为Foo的实例对象Bar.prototype = new Foo();Bar.prototype.foo = 'Hello World';// 修正Bar.prototype.constructor为Bar本身Bar.prototype.constructor = Bar;var test = new Bar() // 创建Bar的一个新实例// 原型链test [Bar的实例]    Bar.prototype [Foo的实例]         { foo: 'Hello World' }        Foo.prototype            {method: ...};            Object.prototype                {toString: ... /* etc. */};
上面的例子中,test 对象从 Bar.prototype 和 Foo.prototype 继承下来;因此,它能访问 Foo 的原型方法 method。同时,它也能够访问那个定义在原型上的 Foo 实例属性 value。 需要注意的是 new Bar() 不会创造出一个新的 Foo 实例,而是 重复使用它原型上的那个实例;因此,所有的 Bar实例都会共享相同的 value 属性。

this的工作原理

JavaScript 有一套完全不同于其它语言的对 this 的处理机制。 在五种不同的情况下 ,this 指向的各不相同。
全局范围内
this;
当在全部范围内使用 this,它将会指向全局对象。
函数调用
foo();
这里 this 也会指向全局对象。
方法调用
test.foo(); 
这个例子中,this 指向 test 对象。
调用构造函数
new foo(); 
如果函数倾向于和 new 关键词一块使用,则我们称这个函数是 构造函数。 在函数内部,this 指向新创建的对象。
显式的设置 this。
function foo(a, b, c) {}var bar = {};foo.apply(bar, [1, 2, 3]); // 数组将会被扩展,如下所示foo.call(bar, 1, 2, 3); // 传递到foo的参数是:a = 1, b = 2, c = 3
当使用 Function.prototype 上的 call 或者 apply 方法时,函数内的 this 将会被显式设置为函数调用的第一个参数。
因此函数调用的规则在上例中已经不适用了,在foo 函数内 this 被设置成了 bar。
看下面代码:
Foo.method = function() {
    var that = this;
    function test() {
        // 使用 that 来指向 Foo 对象
    }
    test();
}
that 只是我们随意起的名字,不过这个名字被广泛的用来指向外部的 this 对象。

闭包和引用

闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。 因为函数是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。如果读过laravel(很流行的PHP框架),里面大部分都使用了闭包**!。
代码比较:
for(var i = 0; i < 10; i++) {    setTimeout(function() {        console.log(i);      }, 1000);}

for(var i = 0; i < 10; i++) {    (function(e) {        setTimeout(function() {            console.log(e);          }, 1000);    })(i);}
用过jquery的老铁们肯定都知道自执行匿名函数。



原创粉丝点击