我正在学习继承属性,但我很困惑。我非常感谢您的帮助,让我明白一些。
所以,继承属性是对象从原型对象继承的属性。
我读过的一篇文章给出了继承属性的示例:“每个 JavaScript 对象都从其原型对象继承 toString 属性”
所以,我的问题是: 这些都是遗传的吗?
静态方法
对象.分配()
Object.create()
Object.defineProperty()
Object.defineProperties()
Object.entries()
对象.freeze()
Object.fromEntries()
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptors()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.getPrototypeOf()
Object.is()
Object.isExtensible()
Object.isFrozen()
Object.isSealed()
Object.keys()
Object.preventExtensions()
Object.seal()
Object.setPrototypeOf()
Object.values()
实例属性
对象.原型.构造函数
对象.prototype.__proto__
实例方法
Object.prototype.__defineGetter__()
Object.prototype.__defineSetter__()
Object.prototype.__lookupGetter__()
Object.prototype.__lookupSetter__()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toString()
Object.prototype.valueOf()
(我从MDN对象中找到了这个列表,它们是对象的静态方法、实例属性和实例方法,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object )
那么,这是否意味着所有对象都具有上述属性?
既然函数基本上都是对象,那么函数也继承了这些对象吗?
另外,有没有地方可以找到对象所有继承属性的列表?
提前非常感谢!很抱歉这篇文章很长。
静态方法,仅属于
Object
类(构造函数),这意味着您只能通过执行Object.nameOfMethod()
来调用它们。
另一方面,实例属性和方法被所有对象实例继承,这意味着每个对象都会继承这些属性/方法。
现在请记住,在 JS 中,每个实体如果不是原语,都是一个对象。
例如数组:
const arr = ["hello"]
console.log(typeof arr) // object
console.log(arr instanceof Object) // true
console.log(Array.prototype.isPrototypeOf(arr)) // true
console.log(arr.propertyIsEnumerable(0)) // true
console.log(arr.toLocaleString()) // hello
console.log(arr.valueOf()) // ["hello"]
console.log(arr.hasOwnProperty(0)) // true
console.log(arr.toString()) // hello
这是因为即使JS中的arrays是
Array
的实例,它们也是Object
的实例,你可以将数组视为一个特殊的对象,其中索引是键:
const arr = {
0: "hello"
}
静态方法不能被继承,因为它们存在于类上,而不存在于类的任何实例上。所以那些都出来了。其他方法,绝对!至少我是这么认为的。让我们进行一些实验并检查结果。
const f = () => {
return "hello world"
};
f.foo = "bar";
console.log(f.constructor);
console.log(f.toString());
console.log(f.valueOf());
console.log(f.hasOwnProperty("foo"));
console.log(f.hasOwnProperty("frankincense"));
这个片段表明,是的,非静态方法确实是由函数继承的,因为函数是对象......就像克罗克福德在他的坟墓里打滚一样