JS中的静态属性及实例属性


在回忆怎么判断一个对象是一个数组的方法时,想到了Array.isArray()这个方法,突然有点不理解,这是什么意思,isArray()怎么可以通过Array直接调用,这样的情况很多,比如Object上的方法。
看了几篇文章,简单理解是:JS中有“静态属性”和实例属性。

function Person(name) {this.name = name}
Person.setName = (name) =>{this.name = name}
var per = new Person()
per.setName()   //Uncaught TypeError: per.setName is not a function

静态属性

定义在构造函数上的属性。只能通过构造函数名来调用。
那么就是说,上面的setName方法可以通过Person来调用,不能通过实例调用。因为setName是其内部方法。 举个例子:

function Person() {
    this.age = 20;
}
Person.getName = ()=>{return this.name}
Person.name = "Jona";
var p = new Person();

通过打印p,可以看到:

Person {age: 20}
age: 20
__proto__:
    constructor: ƒ Person()
        getAge: () =>{ return this.age; }
        myName: "Jona"
        length: 0
        name: "Person"
        arguments: null
        caller: null
        prototype: {constructor: ƒ}
        __proto__: ƒ ()
        [[FunctionLocation]]: VM1711:1
        [[Scopes]]: Scopes[1]
    __proto__: Object

可以发现,myName和getAge属性并没有被实例所继承。

实例属性

我的理解是:定义在构造函数原型上的属性及在构造函数内部绑定到this上的属性。这些属性可以通过实例对象直接调用。

function Person(){
    this.name = "Jona";
    this.age = 20;
}
Person.prototype.getName = function(){
    return this.name;
}
var p = new Person();

这个时候,p可以调用name,age,getName这些属性。

查看

可以通过Object.getOwnpropertyNames()等此类方法查看有哪些属性。

Object.getOwnPropertyNames(Array);

//["length", "name", "prototype", "isArray", "from", "of"]

Object.getOwnPropertyNames(Array.prototype);

//["length", "constructor", "concat", "copyWithin", "fill", "find", "findIndex", "lastIndexOf", "pop", "push", "reverse", "shift", "unshift", "slice", "sort", "splice", "includes", "indexOf", "join", "keys", "entries", "values", "forEach", "filter", "flat", "flatMap", "map", "every", "some", "reduce", "reduceRight", "toLocaleString", "toString"]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容