这些属性是继承的吗?

问题描述 投票:0回答:2

我正在学习继承属性,但我很困惑。我非常感谢您的帮助,让我明白一些。

所以,继承属性是对象从原型对象继承的属性。

我读过的一篇文章给出了继承属性的示例:“每个 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

那么,这是否意味着所有对象都具有上述属性?

既然函数基本上都是对象,那么函数也继承了这些对象吗?

另外,有没有地方可以找到对象所有继承属性的列表?

提前非常感谢!很抱歉这篇文章很长。

javascript oop inheritance prototypal-inheritance
2个回答
1
投票

静态方法,仅属于

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"
}

1
投票

静态方法不能被继承,因为它们存在于类上,而不存在于类的任何实例上。所以那些都出来了。其他方法,绝对!至少我是这么认为的。让我们进行一些实验并检查结果。

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"));

这个片段表明,是的,非静态方法确实是由函数继承的,因为函数是对象......就像克罗克福德在他的坟墓里打滚一样

© www.soinside.com 2019 - 2024. All rights reserved.