章节: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