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

来源:互联网 发布:沈阳数据恢复 编辑:程序博客网 时间:2024/06/06 01:15

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之中唯一一个处理对象属性时,不会遍历原型链的方法。