javascript - 为什么原型考虑对象而不考虑函数
问题描述
从这个MDN中,它看起来prototype
是 的一个属性Object
,但它看起来更像prototype
是一个property
的function
而不是?
鉴于下面的代码,它正在命中TypeReference
let Animal = {
name: 'randomAnimal'
}
Animal.prototype.speak = function () {
console.log(this.name + ' makes a noise.');
}
为了使其工作,而不是对象,我们将其更改为功能,如下所示
function Animal (name) {
this.name = name;
}
Animal.prototype.speak = function () {
console.log(this.name + ' makes a noise.');
}
我的问题更多是试图理解为什么说原型被认为是对象的属性背后的士气或原因,尽管有人可以争辩说所有函数都是对象
解决方案
原型是对象属性,函数是第一类对象。
要在实例化期间使对象可参数化,我们可以通过构造函数创建一个对象,如您所写:
function Animal (name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + " says hi!");
}
var lion = new Animal("lion");
lion.speak(); // "lion says hi!"
这里在对象构造时给出了一个名称。
但是你也可以使用对象初始化器来创建对象,比如
let lion = {
name: "lion",
speak: function() {
console.log(this.name + " says hi!");
}
}
lion.speak(); // "lion says hi!"
自然,使用构造函数会更容易,特别是如果您有多个要初始化的属性和/或要构造的多个类似对象。
第三种创建对象的方法是使用 Object.create()。它允许您在创建对象时指定原型对象,例如:
var cat = Object.create(lion);
cat.name = "house cat";
cat.speak(); // "house cat says hi!"
console.log(lion.isPrototypeOf(cat)); // true
有关 JavaScript 中对象的信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
编辑:但默认情况下,所有函数都有一个“原型”成员对象,因为我们不知道该函数是否用作构造函数。使用 Object.create() 创建的对象文字或对象将没有它。
console.log(cat.prototype); //undefined
至于将原型成员对象添加到对象字面量,堆栈溢出问题:将原型添加到对象字面量
推荐阅读
- python - 将条件列表传递给要检查的函数
- python - 对顺序模型中的一批图像使用 tf.image.ssim_multiscale
- oracle - 将表列与 Oracle 中的已连接用户进行比较
- windows-10 - Wix 安装程序显示虚拟文本
- javascript - 基于匹配 Javascript Apps 脚本从二维数组中删除行
- bash - 如何在 xargs 命令中回显文件的尾部
- python - Python While 循环问题。如何让我的while循环检测一个人是否说yes、y、n或no?
- jquery - 单击,缩放到指针位置
- r - 计算 sf 对象列表中选定列的平均值并将值存储在数据框中
- html - 带有连接字符串的 Angular *ngIf