JavaScript:构造函数与原型
JavaScript: Constructor vs Prototype
这个问题以前已经回答过了,但我想确认一下我的理解。在此代码中:
var somePrototype = {
speak: function() {
console.log("I was made with a prototype");
}
}
function someConstructor() {
this.speak = function() {
console.log("I was made with a constructor");
}
}
var obj1 = Object.create(somePrototype);
var obj2 = new someConstructor();
obj1.speak();
obj2.speak();
他们从根本上都在做同样的事情,对吗?唯一的区别是function someConstructor()
是挂起的,这意味着如果需要,我可以在定义它之前调用它的新实例,而var somePrototype
只能在定义它之后调用。除此之外,没有什么区别吗?
两种方法(使用Object.create()
和构造函数调用)之间的区别是:
创建:
Object.create(somePrototype)
创建了一个新的对象,使somePrototype
成为它的原型new someConstructor()
使用构造函数调用创建一个对象。obj2
的原型是一个简单的对象:new Object()
属性继承:
obj1
继承属性speak
,该属性是一个函数。如果somePrototype
对象中的此属性发生更改,则会影响使用Object.create(somePrototype)
创建的继承该属性的任何对象。Object.keys(obj1)
将返回[]
,因为对象没有自己的属性- CCD_ 15包含自己的属性CCD_。在单个实例上修改此属性不会影响使用
new someConstructor()
创建的任何其他实例Object.keys(obj2)
将返回['speak']
作为其列出的属性
构造函数:
obj1.constructor === Object
就是true
obj2.constructor === someConstructor
就是true
吊装:
someConstructor
被提升到它创建的作用域的顶部。因此,它可以在函数声明之前使用- 并且确保
somePrototype
没有与对象文字一起被提升,因此应该在设置值之后使用
查看这篇关于constructor
属性的有趣文章。
Object.create()
调用创建一个对象,并为其提供您请求的原型。new
调用创建一个直接由该构造函数修饰的对象。
不同的是,构造函数创建的对象有一个自己的属性,其值是console.log()
的函数。Object.create()
调用创建一个对象,从原型对象继承类似的函数。
如果将第一个对象传递给Object.keys()
,则不会看到"speak"属性;如果你通过了第二个物体,你会的。
相关文章:
- 如何从构造函数中调用js原型方法
- 通过原型/构造函数从复选框输出值
- Javascript:继承原型而不重新定义构造函数
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 使用构造函数 - 原型从文本框输出值
- JavaScript原型构造函数只调用过一次
- JavaScript 原型构造函数语法 1 与语法 2
- 构造函数属性值应该是什么 .a 原型构造函数或对象构造函数本身
- 什么是原型?构造函数或其他对象
- 在对象上正确设置原型构造函数
- 重构JavaScript原型构造函数中的重复代码
- 是否需要在经典继承中更改子类的“原型.构造函数”
- 将实例属性放置在原型构造函数中,无论好坏
- javascript原型构造函数和instanceof
- 正在原型构造函数中创建对象引用
- 在javascript的构造函数本身中获取原型构造函数的名称
- 原型构造函数和私有属性的区别
- 为什么原型构造函数中的变量在作为属性访问时未定义
- 如何在 Typescript 中实现无原型构造函数
- 如何为原型链中的构造函数找到根原型构造函数?