Javascript对象文字是否具有原型属性?

问题描述 投票:1回答:4

[了解Javascript中的3种广泛类型的对象,即文字,函数对象和函数对象,我读过某个地方,文字对象没有像函数对象(或构造函数)那样的原型属性。这是一个真实的陈述吗?

原因是我问这是因为我们可以做到;

var person = {
fn: 'ABC'
}
person.__proto__ = someObj;

不确定在所有浏览器中是否真的允许使用“ proto”的设置,这就是为什么声明不正确的原因。

对于“来自函数的对象”也同样如此吗?即当我们执行“ new SomeFunctionObject()”

javascript prototype
4个回答
1
投票

我读过某个地方,文字对象没有像函数对象(或构造函数)那样的原型属性。

这听起来像是在引用名为.prototype的属性,这是正确的。 functionclass将自动接收.prototype属性,该属性包含一个属性(constructor,指向类/函数本身),并继承自Object.prototype

您问题中的陈述是正确的。只有可调用的类对象(类和function)会自动接收这些类型的属性。其他对象不:

class Foo {
}
function Foo2() {
}
const obj = {};

console.log(
  Foo.prototype,
  Foo2.prototype,
  obj.prototype
);

关于您问题中的代码,允许使用__proto__,但已弃用。作为MDN says

警告:虽然现在大多数浏览器都支持Object.prototype.__proto__,但它的存在和确切行为仅在ECMAScript 2015规范中已标准化为一项传统功能,以确保与Web浏览器的兼容性。为了获得更好的支持,建议改用Object.getPrototypeOf()

Object.getPrototypeOf现在应该是首选。

即当我们执行“ new SomeFunctionObject()”

[使用new创建实例时,新实例的内部原型通常与构造函数的.prototype属性是同一对象。也就是说,使用以下代码:

class Foo {
  // anything
}
const f = new Foo();

f实例的内部原型将与Foo.prototype是同一对象。

class Foo {
  // anything
}
const f = new Foo();
console.log(
  Object.getPrototypeOf(f) === Foo.prototype,
  f.__proto__ === Foo.prototype,
);

实例的内部原型唯一会与构造函数的.prototype相同的时间是当构造函数显式返回对象时,这有点不寻常。

class Foo { constructor() { return {}; } } const f = new Foo(); console.log( Object.getPrototypeOf(f) === Foo.prototype, f.__proto__ === Foo.prototype, );
您可以使用此设置prototype

Object.setPrototypeOf(obj, prototype)

您也可以阅读文档here

如果您为对象的

proto

显式分配一个值,那么现在该对象当然具有原型属性。当您只为一个对象赋值时,当前它没有原型。此属性在跨浏览器兼容性方面存在一些问题。new Con()构建的对象当然具有本地原型属性。
构造函数具有prototype属性。

function Person(last, first, middle){ // constructors allow private variables that can be shared across methods without the use of `this.` - API developers may accidentally access properties meant to be private in classes, so use constructors const proto = Person.prototype; if(this.last === undefined || last !== undefined){ this.last = last; this.first = first; this.middle = middle; } this.getFullName = (lastFirst = false)=>{ const m = this.middle ? ' '+this.middle : '' if(lastFirst){ return this.last+', '+this.first+m; } return this.first+m+' '+this.last; } this.setFullName = (last, first, middle)=>{ proto.last = this.last = last; proto.first = this.first = first; proto.middle = this.middle = middle; return this; } } const bob = new Person('Smith', 'Bob', 'Gene'); console.log(bob.getFullName()); const james = new Person('Brown', 'James'); console.log(james.getFullName(true)); bob.setFullName('Static', 'Method', 'like'); const person = new Person; console.log(person.getFullName()+' -- sort of');
注意,构造函数的new实例返回new对象文字。

0
投票
您可以使用此设置prototype

0
投票
如果您为对象的

proto


0
投票
构造函数具有prototype属性。
© www.soinside.com 2019 - 2024. All rights reserved.