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
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’);
}
};
上面代码中,Object.create方法以A对象为原型,生成了B对象。B继承了A的所有属性和方法。这段代码等同于下面的代码。
var A = function () {};
A.prototype = {
print: function () {
console.log(‘hello’);
}
};
实际上,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之中唯一一个处理对象属性时,不会遍历原型链的方法。
一.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之中唯一一个处理对象属性时,不会遍历原型链的方法。
相关文章推荐
- 判断对象的类型:instanceof运算符、constructor属性以及构造函数的名字
- javascript 对象及原型继承有关的属性:constructor、prototype、isPrototypeOf、instanceof、in 、hasOwnProperty 等等
- 彻底理解原型、原型链、new操作符、prototype、__proto__、constructor等属性的概念
- javascript 对象及原型继承有关的属性:constructor、prototype、isPrototypeOf、instanceof、in 、hasOwnProperty 等等
- 面向对象的程序设计(二)理解各种方法和属性typeof、instanceof、constructor、prototype、__proto__、isPrototypeOf、hasOwnProperty
- js中判断数据类型的属性typeof、instanceof、 constructor、 prototype
- 彻底深刻理解js原型链之prototype,__proto__以及constructor(一)
- JavaScript的原型链继承__propt__、prototype、constructor的理解、以及他们之间相互的关系。
- js面向对象原型属性和实例属性
- js中的原型与原型链的一点理解
- 详解js中typeof、instanceof与constructor
- (转载)js对象原来也有类、实例属性和原型属性
- JS概念理解(一)——函数和对象、原型链、_proto_
- js的原型对象和constructor研究
- 深入理解javascript原型和闭包(5)——instanceof
- 深入理解javascript原型和闭包(5)——instanceof
- js 对象方法、类方法、原型方法的区别;私有属性、公有属性、公有静态属性
- js原型理解
- js中对象所属类、对象中原型属性以及构造函数三者的关系
- 理解js中的原型链,prototype与__proto__的关系