原始值 VS 对象
javaScript中的值可以被划分为两个大类:原始值(primitive) and 对象(object);
一.primitve
1、字符串
2、数字: 在js的世界里,所有数字都是浮点数,是双精度的
3、布尔值
4、null
5、undefined
二.所有其他的值都是对象
1、primitve 的包装对象:Boolean、Number、String
2、日期
3、创建的对象
(1)对象是可变的。
Js的对象是可以动态添加属性的。
(2)每个对象都有自己唯一的标识符。
通过字面量或者构造函数创建的对象和其他任何对象都不相等。
[]===[] ---false
对象是通过引用来比较的。只有两个对象有相同的标识,才认为对象是相等的。
(3)变量保存了对象的引用。
typeof VS instanceof
typeof 可以用来区分原始值与对象,instanceof可以用来区分对象对象。
typeof null ---- Object
但是, null !=Object
对象的创建
如何理解 var p1=new Person() 这句代码呢?
可以分解成三步操作。
var p1={}; //创建一个新对象
p1.__proto__=Person.prototype; //将构造函数的作用域赋给新对象,
Person.call(p1); //执行构造函数中的代码 返回新对象
这里会改变对象的__proto__属性,属性类型会由Object变成Person,,并且将Person的属性值全部指向p1.
对象的修改
var Person=function() { }; //每个函数都有一个 prototype属性,这个属性指向函数的原型对象
//原型对象会自动获取一个constructor(构造函数)属性,这个属性指向 prototype属性所在的函数 的指针(估计是一种引用)
//调用构造函数创建一个实例后,实例内部 包含一个指针([[Prototype]]))
//Chrome 在每个对象上都支持一个属性 __proto__,未经任何修改时,一个对象 __proto__,类型是Object。
//__proto__指向 构造函数的原型对象
var Programmer = function () { };
Programmer.prototype=new Person();
var Programmer1 = function () { };
Programmer1.prototype=Person.prototype; //问题来了,这两者的区别是什么呢
1、Programmer.prototype=new Person();
此时,Programmer已经不存在constructor(),prototype已经改变,类型已经是Person,
里面有constructor();
2、Programmer1.prototype=Person.prototype;
此时,依旧含有constructor(),但constructorl类型已变成Person,里面的 prototype: Person
外围prototype类型仍旧是Object。
并非所有的对象上都有原型
如果用create去创建对象,创建的方法或属性,都属于原型链,并不是这个对象的属性。