js- 对象

原始值  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,里面的
prototypePerson
  外围prototype类型仍旧是Object。

并非所有的对象上都有原型

     

     如果用create去创建对象,创建的方法或属性,都属于原型链,并不是这个对象的属性。

原文地址:https://www.cnblogs.com/xianrongbin/p/4665810.html