对象没有继承其原型方法的问题

时间:2012-11-27 03:38:58

标签: javascript prototype

查看图片。怎么会这样?是不是应该继承其原型方法的对象?

King< - FixedMovementPiece< - Piece

Piece有setXY方法。

Strange behavior

2 个答案:

答案 0 :(得分:2)

__proto__(在大多数当前浏览器中定义但在当前ECMAScript规范中没有定义)是在搜索原型链时使用的内容。

当函数作为构造函数调用时,使用

prototype来分配新对象的__proto__属性。由于原型通常不是构造函数,prototype.prototype很少有用甚至定义。

的示例:

Array.prototype === (new Array()).__proto__ //true
(new Array()).prototype === undefined //true

var a = {0:'a', 1:'b', 2:'c', length:3}
a.toString() // "[object Object]"
var a = {0:'a', 1:'b', 2:'c', length:3, __proto__:Array.prototype}
a.toString() // "a,b,c"

var obj = {__proto__:{}}
obj.name // undefined
obj.__proto__.name = "someString"
obj.name // "someString"
obj.name2 = "anotherString"
obj.__proto__.name2 // undefined

答案 1 :(得分:1)

对象继承自构造函数的原型(即构造函数在创建实例时具有的原型),由内部[[Prototype]]属性引用。

默认情况下,只有函数具有prototype属性。 e.g。

// Declare function
function Foo(name) [
    this.name = name;
}

// Add a showName method to its prototype
Foo.prototype.showName = function() {
    return this.name;
}

// Create an instance
var foo = new Foo('foo');

// Call inherited method
foo.showName(); // foo

在Mozilla浏览器中还有一个引用对象[[Prototype]]非标准 __proto__属性,它可能在ES6中,但它不适用于一般网络。