isPrototypeOf
当调用一个构造函数创建一个新实例后,该实例的内部将包含一个指针,指向这个构造函数的原型对象。ECMA-262第5版中管这个指针叫[[Prototype]]
。
在所有实现中,是无法访问到[[Prototype]]
的,这里就可以使用isPrototypeOf()
方法来确定对象与构造函数的原型对象之间是否有这个指针存在。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype = {
constructor: Person,
type: '人',
sayHi: function () {
alert('hi');
}
}
function Cat(name,color) {
this.name = name;
this.color = color;
}
Cat.prototype = {
constructor: Cat,
type: '猫',
sayHi: function () {
alert('喵');
}
}
var person = new Person('tom', 24);
var cat = new Cat('小灰', 'gray');
console.log(Person.prototype.isPrototypeOf(person)); // true
console.log(Cat.prototype.isPrototypeOf(cat)); // true
console.log(Person.prototype.isPrototypeOf(cat)); // false
console.log(Cat.prototype.isPrototypeOf(person)); // false
getPrototypeOf
ECMAScript 5
新增的一个方法,这个方法返回 [[Prototype]]
的值,也就是对应的构造的函数的原型对象。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype = {
constructor: Cat,
type: '人',
sayHi: function () {
alert('hi');
}
}
function Cat(name,color) {
this.name = name;
this.color = color;
}
Cat.prototype = {
constructor: Cat,
type: '猫',
sayHi: function () {
alert('喵');
}
}
var person = new Person('tom', 24);
var cat = new Cat('小灰', 'gray');
console.log(Object.getPrototypeOf(person) == Person.prototype); // true
console.log(Object.getPrototypeOf(cat) == Cat.prototype); // true
console.log(Object.getPrototypeOf(person) == Cat.prototype); // false
console.log(Object.getPrototypeOf(cat) == Person.prototype); // false
instanceof
检测一个对象的类型。
详细一点就是: 用来判断一个构造函数的prototype
属性所指向的对象是否存在于另外一个要检测对象的原型链上。
用法:
# 检测一个对象的类型
function Person() {
}
var person = new Person();
alert(person instanceof Person); // true
# 继承中判断实例是否属于它的父类
function Super() {
}
function Sub() {
}
Sub.prototype = new Super();
var instance = new Sub();
console.log(instance instanceof Object); // true
console.log(instance instanceof Super); // true
console.log(instance instanceof Sub); // true
网友评论