比如说,我创建一个类:
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关键字,直接执行类导致报错。
这种问题一般新手容易出现,为了安全才这么做的。