什么是原型,为什么将它们添加到我的json对象中

时间:2018-10-06 12:09:36

标签: javascript jquery json

我正在使用jquery对PHP脚本进行ajax调用,该脚本将json编码的字符串作为对象发回。

{
   "errors":{
      "name":"Name is empty",
      "gender":"Gender is empty"
   },
   "success":false,
   "message":"FAIL"
}

这是返回的json,由于我在ajax调用中使用了dataType: 'json',因此将其转换为对象,然后通过控制台对其进行记录以进行观察。

我看到键/值对在其中,但也有一些(原型)不属于json字符串。它是什么?它是从哪里来的?我可以使用这些功能吗?

我正在附上屏幕截图,因为键入它会搞乱它。

enter image description here

2 个答案:

答案 0 :(得分:5)

不用担心,您可以忽略它。

JavaScript使用原型继承:对象从另一个对象继承其功能,该对象称为其 prototype (后者可能具有自己的原型,依此类推)。可以创建一个没有原型的对象,但是默认情况下,所有对象都可以。

JavaScript中的普通对象继承自基本对象原型(可以通过Object.prototype属性进行访问):解析JSON并创建其内容的普通对象时,其原型就是该对象,即提供toStringvalueOfhasOwnProperty以及其他方法和__proto__属性(在浏览器中)(尽管您应该假装最后一个不存在):

const json = "{}";
const obj = JSON.parse(json);
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true

屏幕快照中的<prototype>文本只是控制台向您显示对象原型的方式,实际上并没有一个具有该名称的属性。 (在标准JavaScript中,对象的原型不会由任何属性引用,只是一个名为[[Prototype]]的内部插槽,您只能通过Object.getPrototypeOf方法进行访问。但是在Web浏览器上,为此指定了一个扩展名__proto__

答案 1 :(得分:1)

javascript中的原型用作继承形式。 Javascript对象继承自其他对象。原型继承用于属性查找,其工作方式如下:

当查找对象的属性时,它将首先查看其自身的属性,如果在该属性中找不到该属性,它将检查其原型是否可以在该属性中解析。

例如:

let obj = {prop1: 1};

console.log(obj.valueOf());

// here we implement the valueOf method on the object
obj.valueOf = function () { console.log('here I implemented valueOf myself') }

// now the own implementation is used because a property on the object
// has priority over a property on the prototype
obj.valueOf();

原型不会以任何方式影响您的代码,它只是增加了您可以立即使用的功能。例如,以上代码中的valueOf方法位于Object.prototype上,并且可用于所有继承自该对象的对象。