《JavaScript语言精粹》学习笔记(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33120763/article/details/78447331

《JavaScript语言精粹》学习笔记(二)

继承

在基于类的语言中,对象是类的实例,类可以从另一个类继承,而继承和实例化其实是把类中的属性和方法全部复制过来,类和实例之间互不影响。

而JS是一门基于原型的语言,这意味着对象直接从其他对象继承 (与其说继承,不如说成是 委托关系 ——- 摘自《你不知道的JavaScript》上卷)

JS是一门弱类型语言,对于一个对象来说重要的是它能做什么,而不是从哪里来。

伪类
new关键字

当一个函数被创建时,Function 构造器产生的函数对象会运行类似这样的一些代码:

    this.prototype = { constructor: this };
新函数对象被赋予一个prototype属性,它的值是一个包含 constructor 属性且属性值为该函数对象的对象。这个prototype对象是存放继承特征的地方。
当采用 构造器调用模式, 用new 去调用一个函数时,函数执行的方式会被修改。 如果new运算符是一个函数,它可能会像这样执行:
    Function.method('new', function(){
        var that = Object.create(this.prototype);
        var other = this.apply(than, arguments);
        return (typeof other === 'object' && other) || that;

    });


伪类继承方法:

    Function.method( "extend", function( Parent ){
        this.prototype = new Parent();
        return this;
    } );
    //用法:
    var Cat = function( name ){
        this.name = name;
    }
    .extend( Animal );
伪类继承的缺陷:无法访问父类的方法,只能访问父类.prototype的方法。 javascript有更多的选择来实现代码重用(比如 对象继承)。

对象说明符:
有时候构造器要接受一大堆参数,而要记住参数的顺序有些困难。在这种情况下,如果我们在编写构造器时让它接受一个简单的对象说明符,可能会更加方便。所以我们可以这样做:
    var myObject= function({
        name: n,
        home: h 
    }) {
        this.name = n;//这里的n其实就是 传入的对象.name
        this.home = h;//同上
    }

    var newObject = new myObject ({
        name: "aaa",
        home: "localhost"
    });



继承:
在一个纯粹的原型模式中,我们会摒弃类,转而专注于对象。基于原型的继承相比基于类的继承在概念上更加简单:一个新对象可以继承一个旧对象的属性。

这里写代码片


比如在js中,一个内部作用域会继承它的外部作用域:当遇到一个左花括号时block函数被调用。

    var block = function() {
        //记住当前作用域。
        var oldScope = scope;

        //构造一个包含了当前作用域中所有对象的新作用域(新作用域继承它的外部作用域中的值、方法)
        scope = Object.create(scope);

        //传递左花括号作为参数调用advance
        advance('{'};

        //使用新的作用域进行解析
        parse(scope);

        //传递右花括号作为参数调用 advance 并抛弃新的作用域,回复原来老的外部作用域
        advance('}');
        scope = oldScope;


    }

猜你喜欢

转载自blog.csdn.net/qq_33120763/article/details/78447331