您的位置:首页 > Web前端 > JavaScript

js之constructor属性/instanceof运算符/原型的理解

2017-10-26 17:01 746 查看
JS:

一.constructor属性

1.prototype对象有一个constructor属性,默认是指向prototype对象所在的构造函数。

例:

function P(){ }

P.prototype.constructor === P;//true

2.由于constructor属性定义在prototype对象上面,代表其可以被所有实例对象继承。

例:

function P(){ }

var p = new P();

p.constructor 等于 function P(){ }

p.constructor === P.prototype.constructor //true

p.hasOwnProperty(‘constructor’); //false p是构造函数P的实例对象,但是p自身没有contructor属性,该属性其实是读取原型链

上面的P.prototype.constructor属性。

3.通过constructor属性,可以从实例新建另一个实例。

例:

function Constr(){ }

var x = new Constr();

var y = new x.constructor();

y instanceof Constr

二:instanceof运算符

1.instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。

例:

var v = new Vehicle();

v instanceof Vehicle // 对象v是构造函数Vehicle的实例,所以返回true。

2.instanceof运算符的左边是实例对象,右边是构造函数。它会检查右边构建函数的原型对象,是否在左边对象的原型链上。因此,下面两种写法是等价的。

例:

v instanceof Vehicle

// 等同于

Vehicle.prototype.isPrototypeOf(v)

3.instanceof的原理是检查原型链,对于那些不存在原型链的对象,就无法判断。

例:

Object.create(null) instanceof Object // false

Object.create(null)返回的新对象的原型是null,即不存在原型,因此instanceof就认为该对象不是Object的实例。

三:Object

1.Object.getPrototypeOf方法返回一个对象的原型。这是获取原型对象的标准方法

例:

// 空对象的原型是Object.prototype

Object.getPrototypeOf({}) === Object.prototype

// true

// 函数的原型是Function.prototype
function f() {}
Object.getPrototypeOf(f) === Function.prototype
// true

// f 为 F 的实例对象,则 f 的原型是 F.prototype
var f = new F();
Object.getPrototypeOf(f) === F.prototype
// true


2.Object.setPrototypeOf方法可以为现有对象设置原型,返回一个新对象。

Object.setPrototypeOf方法接受两个参数,第一个是现有对象,第二个是原型对象。

例:

var a = {x: 1};

var b = Object.setPrototypeOf({}, a);

// 等同于

// var b = {proto: a};

b.x // 1

上面代码中,b对象是Object.setPrototypeOf方法返回的一个新对象。该对象本身为空、原型为a对象,所以b对象可以拿到a对象的所有属性和方法。b对象本身并没有x属性,但是 JavaScript 引擎找到它的原型对象a,然后读取a的x属性。

3.Object.create()

生成实例对象的常用方法,就是使用new命令,让构造函数返回一个实例。但是很多时候,只能拿到一个实例对象,它可能根本不是由构建函数生成的,那么能不能从一个实例对象,生成另一个实例 对象呢?

JavaScript 提供了Object.create方法,用来满足这种需求。该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象。该实例完全继承继承原型对象的属性.

例:

// 原型对象

var A = {

print: function () {

console.log(‘hello’);

}

};

// 实例对象
var B = Object.create(A);
B.print() // hello
B.print === A.print // true


上面代码中,Object.create方法以A对象为原型,生成了B对象。B继承了A的所有属性和方法。这段代码等同于下面的代码。

var A = function () {};

A.prototype = {

print: function () {

console.log(‘hello’);

}

};

var B = new A();
B.print === A.prototype.print // true


实际上,Object.create方法可以用下面的代码代替。如果老式浏览器不支持Object.create方法,可以就用这段代码自己部署。

if (typeof Object.create !== ‘function’) {

Object.create = function (obj) {

function F() {}

F.prototype = obj;

return new F();

};

}

上面代码表明,Object.create方法的实质是新建一个构造函数F,然后让F.prototype属性指向参数对象obj,最后返回一个F的实例,从而实现让该实例继承obj的属性。

4.hasOwnProperty方法是JavaScript之中唯一一个处理对象属性时,不会遍历原型链的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  prototype 对象 实例
相关文章推荐