var arr = [1,2,3];
arr.push(4);
console.log(arr);//1,2,3,4
arr.addClass('blue');
报错
我们可以:
arr.proto.addClass = function(){console.log('ok!!')}
arr.addClass();//ok!!
每一个!每一个函数都有prototype属性
var fn = function(){}
fn.protoType

其中fn === fn.prototype.constructor
插一段==和===的区别
1.==
(1)自动转换数据类型
var a = 1;
var b = '1';
var c = true;
alert(a == b); //true
alert(a == c); //true
alert(b == c); //true
(2)一个基本数据类型与一个引用数据类型 :会将对象转化为它的原始值,在与基本数据类型进行比较。
var arr = [1,2];
var str = "1,2";
alert(arr == str); //内部执行valueOf(),将arr值转化为原始值,但是arr并没有变化,显示true
将对象转化为它的原始值,也就是说后台会自动调用Object.prototype.valueOf()方法:var arr = [1,2];
var str = "1,2";
alert(arr.__proto__.hasOwnProperty("valueOf")); //false
alert(Object.prototype.hasOwnProperty("valueOf")); //true
Object.prototype.valueOf = function(){
alert("valueOf"); //valueOf
};
alert(arr == str); // 因为自己写的valueOf()重新覆盖了Object.prototype.valueOf()方法,所以不能实现原始值的转化,具体请百度valueOf()内部实现机制,所以此处显示false
(3). 两个引用类型:判断两者之间的引用地址
var arr1 = [1,2]; //引用地址1
var arr2 = [1,2]; //引用地址2
alert(arr1 == arr2); //两者引用地址不同,显示false
2===
相对于"=="来说,只要类型不一致,它就直接返回false
不过还是建议尽量使用"===",因为"=="不严谨,可能会带来一些违反直觉的后果。比如我们常使用的对象,有时获取不到而被赋值为undefine的情况。
var obj = undefined;
if(obj == null){
console.log("1"); //执行
}
if(obj === null){
console.log("2"); //不执行
}
好的,回来说prototype


所有通过函数new出来的东西都有一个proto指向这个函数的prototype
prototype(显示原型)
proto(隐是原型)
var arr = [1,2,3]
arr.__proto__ === Array.prototype//true


var obj = {
fn1:function(){
console.log('fn1');
}
}
console.log(obj.fn1);//fn1
console.log(obj.toString);//['object' ,'object']
当在obj中找不到方法是,它回去obj的原型里找
console.log(obj.fn2);//报错,无fn2方法
在obj里没有fn2,obj的原型里也没有fn2方法
像arr.push(4)
本身arr是没有push方法的,但是它的原型Array有啊
原型链改写和引用

网友评论