Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建既像JavaScript对象文字又像函数的行为_Javascript - Fatal编程技术网

创建既像JavaScript对象文字又像函数的行为

创建既像JavaScript对象文字又像函数的行为,javascript,Javascript,我希望能够做到以下几点: person('male'); person.age(34); 如您所见,我希望person对象既是函数又是对象。我的意思是这样做: function person(gender){ this.gender = gender || 'unknown'; } person.gender; // undefined 不允许我这样做: function person(gender){ this.gender = gender || 'unknown'

我希望能够做到以下几点:

person('male');
person.age(34);
如您所见,我希望
person对象
既是
函数
又是
对象
。我的意思是这样做:

function person(gender){

    this.gender = gender || 'unknown';
}
person.gender; // undefined
不允许我这样做:

function person(gender){

    this.gender = gender || 'unknown';
}
person.gender; // undefined
除非我从person函数创建一个新对象,如下所示:

var me = new person();
me.gender; // 'unknown'
person.age = 34;
car();
car.start();
car();
car.start();
我不希望这样,因为我仍然希望能够设置其他属性,例如:

var me = new person();
me.gender; // 'unknown'
person.age = 34;
car();
car.start();
car();
car.start();
这可能吗?当然,我是在试图完成不可能的事情吗?

function car() {

  console.log("car called");

  car.start = function() {
    console.log("car.start called");
  }

}
car();
car.start();

/**** output:****
car called
car.start called
*/
澄清一下:我不想创建实例。关键是我只想能够将函数
person
作为调用
function.property()
来调用

编辑:也许我用了一个错误的例子,把很多人(包括我自己)弄糊涂了。一个更简单的问题是:我如何调用一个函数和该函数的“属性”,如下所示:

var me = new person();
me.gender; // 'unknown'
person.age = 34;
car();
car.start();
car();
car.start();

两者同时进行,无需创建car实例?

如果您能解释一下您想做的事情背后的动机,我们可能会给出更好的答案。然而,是的,你所描述的是可能的。在JavaScript中,函数只是另一种类型的对象。这意味着您可以定义一个函数,然后对其设置属性,如下所示:

var person = function () {
    return "Hi, I am a person!";
};

person.species = "human";
person.foo = 42;

console.log( person() ); // prints: Hi, I am a person!
console.log( person.species ): // prints: human
console.log( person.foo ); // prints: 42
或者从第二个例子开始:

var car = function () {
    return {
        model: "Focus",
        make: "Ford",
        year: 2010
    };
};

car.start = function () {
    return "Vroom!";
};

console.log ( car.make ); // prints: Ford
console.log ( car.start() ); // prints Vroom!
顺便说一下,这与返回对象的函数不同。可能是这样的:

var person = function () {
    return {
        species: "human",
        name: "Bob",
        age: 27
    };
};

var bob = person();
bob.occupation = "cubicle drone";

console.log( bob.name ); // prints: Bob
console.log( bob.occupation ); // prints: cubicle drone
console.log( person.occupation ); // prints: undefined
console.log( bob == person ); // prints: false
变量
bob
person
都包含对象,但不包含相同的对象,甚至不包含相同类型的对象。

您还可以执行以下操作:

function person(gender){  
  return {
    gender: gender || 'unknown'
  };
}
var p = person('male');
p.age = 34;
p.name = 'John';
etc...

没有使用“new”,您仍然可以重复使用person功能

不要在函数中使用
this
,它通过使用
new
操作符调用该函数作为构造函数运行时创建的对象实例,您可以使用
参数。被调用方
引用函数本身

function person(gender){
    arguments.callee.gender = gender || 'unknown';
}
如果要确保函数始终用作构造函数,即使在没有
new
运算符的情况下调用,也可以通过隐式调用它来实现

function person(gender){
    if(!(this instanceof person)){ return new person(gender); }
    this.gender = gender || 'unknown';
}
在所有其他方面,函数可以做任何常规对象可以做的事情,这就是为什么它们经常被描述为“第一类对象”

您可以简单地将对象或方法等属性指定给它们

function car(){
}
car.start = function(){

}
您还可以让它们使用
\uuuu proto\uuu
属性从函数继承方法

function bird(){}
function platypus(){}

bird.layEggs = function(){};
platypus.__proto__ = bird;
platypus.layEggs()         // now you know

您的编辑:

编辑:也许我用了一个错误的例子,把很多人(包括我自己)弄糊涂了。一个更简单的问题是:我怎样才能 调用函数和该函数的“属性”,如下所示:

var me = new person();
me.gender; // 'unknown'
person.age = 34;
car();
car.start();
car();
car.start();
两者同时进行,而无需创建car实例

这就是你要找的吗?

function car() {

  console.log("car called");

  car.start = function() {
    console.log("car.start called");
  }

}
car();
car.start();

/**** output:****
car called
car.start called
*/

使用@Winchestro正在使用的instanceof方式的一个小示例

在JSFIDLE上:


函数是对象是的,我知道。我想要如上所述的行为,通常认为两个对象文本的行为都是函数。对于一个(多个)向下投票:请让我知道为什么,以便我可以调整我的问题。(而不是仅仅否决投票)我本想说与@Brandon相同的话,但后来我认为你的问题可能比这更有趣,这就是为什么我要求你澄清这个问题,因为读了4遍之后,我仍然没有得到你想要的。你可以做你想做的。。我认为您的问题是,对于
gender
,您试图使用
this.gender
,这毫无意义,因为您没有使用
person
的实例。此没有上下文。您应该使用
person.gender=gender | | |“unknown”固定打字错误(谢谢Kyle!)指出了返回对象的区别。没问题,我想这就是你们的意思。