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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值