zoukankan      html  css  js  c++  java
  • 汤姆大叔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,受益匪浅,感谢!在此只是做记录,便于记忆)
  • 相关阅读:
    [FJOI 2016] 神秘数
    [SHOI 2017] 寿司餐厅
    [HAOI 2012] Road
    [HAOI 2012] 容易题
    [TJOI 2018] XOR
    [NOI 2011] 阿狸的打字机
    [ZJOI 2010] 排列计数
    [TJOI2016 & HEOI2016] 字符串
    [HNOI 2011] 数学作业
    【NTT】loj#6261. 一个人的高三楼
  • 原文地址:https://www.cnblogs.com/gfqFighting/p/2687241.html
Copyright © 2011-2022 走看看