《JavaScript语言精粹》笔记(内附《JavaScript语言精粹》百度云下载链接)

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

章节:3.4 引用 【P22(页码)】
知识点:对象通过引用来传递,它们永远不会被传递

 var a_obj={a:1};
 var b_obj=a_obj;//b_obj是a_obj的引用
 b_obj.a=2;
 console.log(a_obj.a);//2

章节:3.5 原型 【P22】
知识点:每个对象都连接到一个原型对象,并且它可以从中继承属性。原型连接在更新时是不起作用的,当我们在对某个对象作出改变时,不会触及该对象的原型。

   Bb.prototype.a=3;
   Bb.prototype.b=4;
   Bb.prototype.aa=function (a,b) {
       console.log("22");
   };
   var a_obj=new Bb();
   console.log(Bb.prototype.a);//3
   console.log(a_obj.a);//3
   a_obj.a=2222;
   console.log(Bb.prototype.a);//3
   console.log(a_obj.a);//2222

章节:4.7 给类型增加方法 【P32】
给类添加的新的方法立刻被赋予到所有的值(对象实例)上,哪怕值(对象实例)是在新方法创建之前就被创建好了。

  Function.prototype.att1="11";
  Function.prototype.att2=function (a,b) {
      return a-b+10;
  };

  function Add(a,b) {
      return a+b;
  };
  Add.prototype.att1="att1";
  Add.prototype.att2=function (a,b) {
      return a-b;
  };

  console.log(Add.att1);//11
  console.log(Add.prototype.att1);//att1
  console.log(Add.att2(8,1));//17
  console.log(Add.prototype.att2(10,1));//9

从上面的例子可以看出,第一个控制台结果,Add中没有属性att1,于是去他的prototype所指向的原型函数中找,找到att1属性值为11;第二个控制台结果,由于设定了 Add.prototype.att1=”att1”;所以得到的结果就是“att1”。
通过下面这种方式,
例1:给 Function.prototype添加方法使得该方法对所有函数可用

  Function.prototype.method=function (name,func) {
    console.log("Function.prototype.method:"+this);
     //function Mumber(){}
    if(!this.prototype[name])
          {
              this.prototype[name]=func;
          }
          return this;
   };
     Number.method('integer',function () {
         console.log("integer:"+this);//-3.33333333..
         console.log(typeof this);//Object
//                return this>0?Math.floor(this) : Math.ceil(this);
         return Math[this>0?'floor':'ceil'](this);
     });
//            也可以直接用这用方式,但上面的方式更加简洁,避开了添加prototype
//            Number.prototype.integer=function () {
//                return this>0?Math.floor(this) : Math.ceil(this);
//            };
      document.writeln(Number(-10/3).integer());

例2:

    Function.prototype.method=function (name,func) {
           if(!this.prototype[name])
            {
                this.prototype[name]=func;
            }
            return this;
     };
    function myFun() {}
    //给我自己写的函数添加新的属性ret
     myFun.method('ret',function () { 
         return 'ret';
     });
     console.log(myFun.prototype.ret());
//            console.log(myFun().ret());
     console.log(Number.prototype);
     console.log(myFun.prototype);
     给JavaScript中本来就有的函数添加新的属性num
     Number.method('num',function () {
         return 'num';
     });
     console.log(Number().num());
     console.log(Number.prototype.num());

结果:
这里写图片描述
如果把我注释的地方放开:
这里写图片描述
结论:给自己写的函数添加属性时,应该通过myFun.prototype.ret()这种形式访问而不是myFun.ret()。但是给JavaScript中本来就有的函数添加方法时两种访问形式都可以。至于为什么,可以从打印出来的两种函数的原型指向可以看出这两种函数的区别。

章节:4.12 模块 【P40】
使用函数和闭包来构造模块;摒弃全局变量的使用
章节:6.3 删除(数组元素) 【P60】
由于在JavaScript中数组就是对象,所以可以用delete运算符删除数组的元素
,但是会有一个问题,被删除的元素保留了他的位置,而值变为undefined,这其实是我们不希望看到的。
例:
var myArray=[‘a’,’b’,’c’,’d’];
delete myArray[2]; //[‘a’,’b’,undefined,’d’]
但是,JavaScript的数组有一个splice方法,第一个参数是数组中一个元素的序号,第二个参数是要删除的元素个数。
例:
myArray.splice(2,1); //[‘a’,’c’,’d’]
章节 附录A
1.typeof不能识别Object和null
typeof null //返回的是‘Object’
typeof不能识别NaN和number
typeof NaN //返回的是‘number’

《JavaScript语言精粹》下载地址:
链接:https://pan.baidu.com/s/1jtfJ59aabGNBbPik4IYqtg 密码:synu

猜你喜欢

转载自blog.csdn.net/IT_10/article/details/81273049