首页 > JS怎样在不创建实例的情况下,访问类的属性和方法?

JS怎样在不创建实例的情况下,访问类的属性和方法?

比如说,我创建一个类:

function Person(){
    this.name="Bill"
    this.age="50"
    this.talk=function(){
        alert("Hello.")
    }
}

那么我不想new一个Person的实例,怎样直接访问Person这个类的属性或者方法?
或者说有时候我创建了一个实例,修改了age=18,但是我又想知道age的默认值,这时候就需要访问Person的age。


首先js没有类的概念,他不像java。然后如果你要给Person这个构造函数赋初始值,直接可以用Person.age在外层赋值,因为函数在js中追本溯源还是Object.


一个比较笨的方法是构造函数改成这种形式:


function Person(options) {
    this.name = options.name;  
    this.age = options.age;
}

默认值直接访问options对象


好多答案中要修改Person本身,不管是放到prototype里还是怎么样,那不是修改了题主的意思了么?

给一个不需要修改Person本身,而且也没有“new一个Person的实例”:

function Person(){
    this.name="Bill"
    this.age="50"
    this.talk=function(){
        alert("Hello.")
    }
}

var ori = {}

Person.call(ori);

ori.age === "50" // true

可以这样写:

var Person = {
    name : "Bill",
    age : "50",
    talk : function(){
        return "Hello.";
    }
};

调用例子:

alert(Person.name);
alert(Person.age);
alert(Person.talk());

注意:person里面用的是逗号(,),最后一个元素不用逗号。


@开源无憾 的答案是可行的,不过有点复杂,给你来个简单点的

var Person = (function() {
    function Person() {
    }

    Person.prototype = {
        constructor: Person,
        age: 12
    };

    return Person;
})();


var p1 = new Person();
p1.age = 18;
console.log(`p1.age = ${p1.age}, defaultAge = ${Person.prototype.age}`);

其中 var ClassName = (function() {...})(); 是我定义类的习惯写法,你可以不管,只要里面的内容也是一样的。


...

你写一个常量用来存储啊。。。


看实际应用场景,遇到你这个问题我首先会想到两个设计模式:单例模式和安全模式。
单例模式不做赘述,只需要new一次就够了!
说一下安全模式:

var Demo = function(){
    if(!(this instanceof Demo)){
        return new Demo();
    }
}
Demo.prototype = {
    show:function(){
        console.log('成功获取!');
    }
}

var d = Demo();
d.show();//成功获取!

安全模式个人理解,是避免在使用的时候据略new关键字,直接执行类导致报错。
这种问题一般新手容易出现,为了安全才这么做的。

【热门文章】
【热门文章】