js原型对象及常见使用情况
js原型对象及常见使用情况
prototype 属性的作用
function Cat(name, color) {
          
   
  this.name = name;
  this.color = color;
  this.meow = function () {
          
   
    console.log(喵喵);
  };
}
var cat1 = new Cat(大毛, 白色);
var cat2 = new Cat(二毛, 黑色);
cat1.meow === cat2.meow
// false 
正常情况下,上述的meow会被调用两次,同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费。
但如果cat1和cat2都是白色的情况下,就要写两次白色,很尴尬,所以就有了下面的用法
function Animal(name) {
          
   
  this.name = name;
}
Animal.prototype.color = white;   //直接对原型对象的定义
var cat1 = new Animal(大毛);
var cat2 = new Animal(二毛);
cat1.color // white
cat2.color // white 
对于普通函数来说,该属性基本无用。但是,对于构造函数来说,生成实例的时候,该属性会自动成为实例对象的原型。原型对象上添加一个color属性,结果,实例对象都共享了该属性。
如果想把一个构造函数变成一个数组,就可以用prototype属性指向一个数组,就意味着实例对象可以调用一个数组
prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数
var MyArray = function(){
          
   };
  console.log(MyArray.prototype.constructor == MyArray)   //true  prototype原始属性function没有改变
  MyArray.prototype = new Array();
  console.log(MyArray.prototype.constructor == MyArray)   //false prototype已经变成了Array属性
  var mine = new MyArray();
  console.log(mine.push(1,2,3))
  console.log(mine.length)    //3
  console.log(mine instanceof Array)   //true  这里已经变成数组了 
constructor的作用
1、constructor属性的作用是,可以得知某个实例对象,到底是哪一个构造函数产生的
function F() {
          
   };
var f = new F();
f.constructor === F // true
f.constructor === RegExp // false 
2、直接通过一个实例对象新建一个实例
function Constr() {
          
   }
var x = new Constr();
var y = new x.constructor();
y instanceof Constr // true 
3、构造函数的原型对象单独被更改时,constructor的方法会保留构造函数的原型对象
function Person(name){
          
   
      this.name = name;
  }
  var f = new Person();
  console.log(f.constructor.name);    //Person   获得原型对象的构造函数的名字
  console.log(Person.constructor.name);//function  获得构造函数的类型
  Person.prototype.constructor === Person //true
  Person.prototype = {
          
   
      method: function(){
          
   }
  }
 
  Person.prototype.constructor === Person //false
  console.log(Person)    //[Function: Person]
  console.log(Person.prototype.constructor)     //[Function: Object] 
所以,修改原型对象时,一般要同时修改constructor属性的指向。
所以有下面的例子:
// 坏的写法
C.prototype = {
          
   
  method1: function (...) {
          
    ... },
  // ...
};
// 好的写法
C.prototype = {
          
   
  constructor: C,
  method1: function (...) {
          
    ... },
  // ...
};
// 更好的写法
C.prototype.method1 = function (...) {
          
    ... }; 
instanceof运算符
概念:
var v = new Vehicle();
原理:instanceof运算符左边是实例对象,右边是构造函数。它会检查右边构造函数的原型对象,是否在左边对象的原型链上
等价写法为: Vehicle.prototype.isPrototypeOf(v)
功能
1、判断对象类型
var obj = {
          
    foo: 123 };
obj instanceof Object // true
null instanceof Object // false
				       
			          