Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有人能澄清prototype和constructor这个词的歧义吗?_Javascript_Oop_Constructor_Prototype - Fatal编程技术网

Javascript 有人能澄清prototype和constructor这个词的歧义吗?

Javascript 有人能澄清prototype和constructor这个词的歧义吗?,javascript,oop,constructor,prototype,Javascript,Oop,Constructor,Prototype,作为一名面向对象JavaScript新手,我注意到没有太多的重点放在语言“原型”和“构造函数”的模糊性所带来的混乱上,这让我怀疑我是否走上了正确的道路,或者误解了整个概念 例如,引用以下函数树: function Tree(name) { this.name = name; } 当还有一个名为prototype的属性时,作为原型,如在Object.prototype中。前者是函数的类型,后者是对象的属性。这有时会产生误导,因为当有人说某个对象的实例继承其原型的功能时,他们实际上是说该实例从

作为一名面向对象JavaScript新手,我注意到没有太多的重点放在语言“原型”和“构造函数”的模糊性所带来的混乱上,这让我怀疑我是否走上了正确的道路,或者误解了整个概念

例如,引用以下函数树:

function Tree(name) {
  this.name = name;
}
当还有一个名为prototype的属性时,作为原型,如在Object.prototype中。前者是函数的类型,后者是对象的属性。这有时会产生误导,因为当有人说某个对象的实例继承其原型的功能时,他们实际上是说该实例从名为prototype的对象/函数类型继承名为prototype的属性(更不用说prototype属性之外还有其他属性,如object.is()或object.keys)()不是继承的!)

第二,构造器这个词经常被松散地使用,至少在初学者眼中是这样。例如,当一个人说构造器的原型时,他们是指person1的函数Person(),其中person1是Person()的实例?还是指person1.constructor?当一个人说“构造器的原型”时,它们是指Object.constructor.prototype还是构造函数Person()的原型


进一步加剧混淆的是,有时person1.constructor实际上等同于构造函数函数Person(),而实际上它们是两个不同的东西。person1.constructor的构造函数是person1对象的属性,而函数Person()的是一种称为构造函数的函数类型。如果他们将称为构造函数的函数类型重命名为blueprint,则可以很容易地看出我所说的混淆是什么意思。

以代码说明此问题

//树是“构造函数”。
函数树(名称){
this.name=名称;
}
//Tree.prototype是Tree的“prototype”
//getName方法是在树的原型上定义的
Tree.prototype.getName=函数(){
返回此名称
}
//当您实例化一个新树时
const treeInstance=新树()
//实例的构造函数属性引用了
//创建了它。在这个例子中,树。
console.log(treeInstance.constructor==树)
//实例的原型是Tree.prototype
console.log(Object.getPrototypeOf(treeInstance)==Tree.prototype)
//有趣的是,这个实例有属性“name”
console.log(treeInstance.hasOwnProperty('name')==true)
//但是getName不在实例上
console.log(treeInstance.hasOwnProperty('getName')==false)
//这是因为getName存在于其中一个原型上。
//在本例中,Tree.prototype
console.log(treeInstance.getName==Tree.prototype.getName)

console.log(treeInstance.getName==Object.getPrototypeOf(treeInstance.getName)
用代码说明问题

//树是“构造函数”。
函数树(名称){
this.name=名称;
}
//Tree.prototype是Tree的“prototype”
//getName方法是在树的原型上定义的
Tree.prototype.getName=函数(){
返回此名称
}
//当您实例化一个新树时
const treeInstance=新树()
//实例的构造函数属性引用了
//创建了它。在这个例子中,树。
console.log(treeInstance.constructor==树)
//实例的原型是Tree.prototype
console.log(Object.getPrototypeOf(treeInstance)==Tree.prototype)
//有趣的是,这个实例有属性“name”
console.log(treeInstance.hasOwnProperty('name')==true)
//但是getName不在实例上
console.log(treeInstance.hasOwnProperty('getName')==false)
//这是因为getName存在于其中一个原型上。
//在本例中,Tree.prototype
console.log(treeInstance.getName==Tree.prototype.getName)

console.log(treeInstance.getName==Object.getPrototypeOf(treeInstance.getName)
well“prototype”和“constructor”是相关的概念,但它们指的是截然不同的东西。“constructor”总是一个函数,而“prototype”是可以是一个函数,但几乎总是一个常规对象。正如我所说,MDN页面是错误的。
Tree()
不是原型,它是一个构造函数。我已经修复了该页面。“constructor”属性是对用于实例化对象的构造函数的引用。@Kevvv它是一个构造函数,“constructor”类的实例,所以指向它的属性被称为
.constructor
。这可能是什么?我看不出有任何歧义。@Bergi所以当我说什么是树的构造函数时,它应该总是指tree.constructor和tree,因为它们指向同一事物,行为相同吗?@Kevvv是的,
函数是
的构造函数-它是使用
新树
构建的。它也可以作为
树。构造函数
访问。鉴于它们是相同的东西,“树的构造函数”一词没有歧义:-)当然,在边缘情况下,它们指的是不同的东西,然后——但只有在那时——重要的是要准确区分“树的
.constructor
属性”和“用于构造
对象的函数”。好吧,“原型”和“构造函数”是相关概念,但它们指的是截然不同的东西。“构造函数”总是一个函数,“原型”可以是一个函数,但几乎总是一个普通对象<代码>树()不是原型,而是构造函数。我已经修好了这一页。“constructor”属性是对用于实例化对象的构造函数的引用。@Kevvv它是一个构造函数,是类实例的“构造函数”,因此指向它的属性被称为
。constructor
。还可能是什么?我看不出有任何模棱两可之处