美文网首页
js源码理解

js源码理解

作者: 喵呜Yuri | 来源:发表于2018-04-08 09:17 被阅读7次

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


image.png

其中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


image.png image.png

所有通过函数new出来的东西都有一个proto指向这个函数的prototype
prototype(显示原型)
proto(隐是原型)

var arr = [1,2,3]
arr.__proto__ ===  Array.prototype//true
image.png
image.png
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有啊

原型链改写和引用

image.png

相关文章

网友评论

      本文标题:js源码理解

      本文链接:https://www.haomeiwen.com/subject/khlxhftx.html