这是一个非常争论的问题,但我认为原因是缺乏关于这一主题的良好文档和好书。
当我学习一门语言时,即使我的一些测试是荒谬的,我也会进行大量挖掘,但我认为理解事物的唯一方法就是进行各种实验。
我开始使用JavaScript,而且我的代码也越多,我就越困惑。
让我们查看代码(暂时忘记无意义,只考虑输出):
function Vehicle()
{
this.color = 'Blue'
}
var car = new Vehicle()
console.log('Vehicle.constructor: ', Vehicle.constructor)
console.log('car.constructor: ', car.constructor)
console.log('Vehicle.prototype: ', Vehicle.prototype)
console.log('car.prototype: ', car.prototype)
console.log('Vehicle.constructor.prototype: ', Vehicle.constructor.prototype)
console.log('car.constructor.prototype: ', car.constructor.prototype)
console.log('Vehicle.prototype.constructor: ', Vehicle.prototype.constructor)
console.log('car.prototype.constructor: ', car.prototype.constructor)
Output:
Vehicle.constructor: Function()
car.constructor: Vehicle()
Vehicle.prototype: Vehicle {} // curly braces here
car.prototype: undefined
Vehicle.constructor.prototype: function()
car.constructor.prototype: Vehicle {} // curly braces here
Vehicle.prototype.constructor: Vehicle()
TypeError: car.prototype is undefined
我的结论:
Vehicle.prototype == car.constructor.prototype == Vehicle {} //花括号在这里
Vehicle.prototype.constructor == car.constructor == Vehicle()//括号在这里
Vehicle.constructor == Function()//大写'F'
Vehicle.constructor.prototype == function()//小写'f'
car.prototype == undefined //未定义但未报告为错误
car.prototype.constructor //输入错误。这里'car.prototype'被报告为错误
现在让我们考虑类似的代码:
var car = {color: 'Blue'}
console.log('car.constructor: ', car.constructor)
console.log('car.prototype: ', car.prototype)
console.log('car.constructor.prototype: ', car.constructor.prototype)
console.log('car.prototype.constructor: ', car.prototype.constructor)
Output:
car.constructor: Object()
car.prototype: undefined
car.constructor.prototype: Object {} // curly braces here
TypeError: car.prototype is undefined
正如我们所看到的,这里'car.prototype'仅 未定义,但'car.prototype.constructor'未定义且也'TypeError'
上面的代码在Firebug中进行了测试。我不知道这是Firebug的错还是JavaScript错误。
所有这些让我感到困惑。
如果这是JavaScript中的OOP,我认为这是更多ODP - 面向对象(Dis)的编程
的修改
1)当car.prototype.constructor为TypeError时,为什么car.prototype未定义
2)为什么函数和对象都有构造函数和原型(参见上面的代码)?
3)这是什么意思:
Vehicle.constructor.prototype:function()
Vehicle.prototype.constructor:Vehicle()
car.constructor.prototype:Vehicle {}
答案 0 :(得分:0)
每次使用对象文字表示法声明对象时
var newObject = {foo: 'bar'};
您正在创建一个继承自'Object()'
的对象,并且没有自己的原型。
请注意,当您致电'car.constructor'
时,它会返回'Object()'
。这是因为这是JS在对象文字表示法中使用的构造函数。
当你调用'car.prototype'
时,它是未定义的,因为对象文字没有自己的原型。
当你调用'car.constructor.prototype'
时,它会返回一个空对象,因为它基本上是'Object()'
的值。它只是创建对象。
为了让你的对象拥有自己的原型,你必须建立一个构造函数并使用
'new myObject()'
声明您的对象。
我希望我已经帮助回答了你的问题。以下是一些包含更多信息的链接:
Adding Prototype to JavaScript Object Literal
http://doctrina.org/Javascript-Objects-Prototypes.html
http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/
答案 1 :(得分:0)
你应该永远记住:JavaScript中的每个函数实际上都是一个Function对象,因为Function继承自Object,任何函数也都是Object。所以,请记住这句话,看看这个:
(function f(){}) instanceof Function; // true
(function f(){}) instanceof Object; // true, as Function is an instance of Object
({}) instanceof Object; // true
({}) instanceof Function; // false!
Function.prototype instanceof Object; // true
Function instanceof Object; // true, as all objects in JS are inherited from Object
Object instanceof Function; // true, as Object is a constructor function, therefor:
Function instanceof Function; // true
Object instanceof Object; // true, but:
Date instanceof Date; // false
Function.prototype.constructor === Function; // true
Function.constructor === Function; // true
typeof Object === 'function'; // true, as Object is a constructor function
因此,不同的大括号表明原型始终是一个对象(花括号),如果它被定义,构造函数总是一个函数。就是这样。