prototype
:[了解Javascript中的3种广泛类型的对象,即文字,函数对象和函数对象,我读过某个地方,文字对象没有像函数对象(或构造函数)那样的原型属性。这是一个真实的陈述吗?
原因是我问这是因为我们可以做到;
var person = {
fn: 'ABC'
}
person.__proto__ = someObj;
不确定在所有浏览器中是否真的允许使用“ proto”的设置,这就是为什么声明不正确的原因。
对于“来自函数的对象”也同样如此吗?即当我们执行“ new SomeFunctionObject()”
我读过某个地方,文字对象没有像函数对象(或构造函数)那样的原型属性。
这听起来像是在引用名为.prototype
的属性,这是正确的。 function
和class
将自动接收.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
对象文字。
prototype
:proto
prototype
属性。