• 汤姆大叔JavaCript系列4阅读笔记


    var BaseCalculator = function() {
    this.decimalDigits = 2;
    };

    BaseCalculator.prototype = {
    add: function(x, y) {
    return x + y;
    },
    subtract: function(x, y) {
    return x - y;
    }
    };
    var Calculator = function () {
    //为每个实例都声明一个税收数字
    this.tax = 5;
    };

    Calculator.prototype = new BaseCalculator();

    Calculator的原型是指向到BaseCalculator的一个实例上,目的是让Calculator集成它的add(x,y)和subtract(x,y)这2个function,还有一点要说的是,由于它的原型是BaseCalculator的一个实例,所以不管你创建多少个Calculator对象实例,他们的原型指向的都是同一个实例。
    var calc = new Calculator();
    alert(calc.add(1, 1));
    //BaseCalculator 里声明的decimalDigits属性,在 Calculator里是可以访问到的
    alert(calc.decimalDigits);

    那如果我不想让Calculator访问BaseCalculator的构造函数里声明的属性值,那怎么办呢?这么办:

    var Calculator = function () {
    this.tax= 5;
    };

    Calculator.prototype = BaseCalculator.prototype;

    通过将BaseCalculator的原型赋给Calculator的原型,这样你在Calculator的实例上就访问不到那个decimalDigits值了,如果你访问如下代码,那将会提升出错。

    var calc = new Calculator();
    alert(calc.add(1, 1));
    alert(calc.decimalDigits);
    当检查对象上某个属性是否存在时,hasOwnProperty 是唯一可用的方法。同时在使用 for in loop 遍历对象时,推荐总是使用 hasOwnProperty 方法,这将会避免原型对象扩展带来的干扰,我们来看一下例子:
    // 修改 Object.prototype
    Object.prototype.bar = 1;

    var foo = {moo: 2};
    for(var i in foo) {
    console.log(i); // 输出两个属性:bar 和 moo
    }

    我们没办法改变for in语句的行为,所以想过滤结果就只能使用hasOwnProperty 方法,代码如下:

    // foo 变量是上例中的
    for(var i in foo) {
    if (foo.hasOwnProperty(i)) {
    console.log(i);
    }
    }
    (感谢汤姆大叔的bog,受益匪浅,感谢!在此只是做记录,便于记忆)
  • 相关阅读:
    安卓API首页
    安卓开发学习1
    Unity3D安卓交互
    跨天查询,少一天的问题
    COALESCE关键字的使用
    Map构造器模式 map builder pattern
    Linux服务器端使用tcpdump抓redis报文
    Java Unsigned Bytes
    JAVA与c#中byte取值范围的差异
    jack反序列化自定义字段绑定,报错:can only instantiate non-static inner class by using default, no-argument constructor
  • 原文地址:https://www.cnblogs.com/gfqFighting/p/2687241.html
Copyright © 2020-2023  润新知