javascript中的function对象

本文详细探讨了JavaScript中函数对象的属性和方法,包括如何通过Function.prototype进行拓展,以及函数对象作为普通对象的特殊用法。通过示例展示了如何给函数添加属性和方法,并解释了函数作为可调用对象的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

function对象都是Function的实例:

> Object.getOwnPropertyNames(Function)
[ 'length',
  'name',
  'arguments',
  'caller',
  'prototype' ]

所以function对象也应该有这些方法或者是属性:

<script type="text/javascript">
var myFunction = function func(name,age){
    //请注意,直接调用这个函数的时候this指向谁
    console.log(myFunction);
    console.log(myFunction.length);
    console.log(myFunction.name);
    console.log(myFunction.arguments);
    console.log(myFunction.caller);
    console.log(myFunction.prototype);
}
myFunction.print = function(){
    //调用这个myFunction对象的时候this指向的是myFunction这个函数对象,这个你必须搞明白
    console.log(this);
    console.log(this.length);
    console.log(this.name);
    console.log(this.arguments);
    console.log(this.caller);
    console.log(this.prototype);
}
myFunction.prototype.print_name = function(){
    console.log('print_name');
}
myFunction('name',22);
myFunction.print();
</script>

 

 

 

所以如果你想要拓展函数,可以给函数添加一些方法:

var myFunction = function func(name,age){}
myFunction.print = function(){
    console.log("name");
}
myFunction.print();

如果你想要让所有的函数都有某些属性,那就必须修改Function.prototype了

var myFunction = function func(name,age){}
Function.prototype.print = function(){
    console.log("name");
}
myFunction.print();

把函数对象也当成对象,感觉特别不习惯,因为习惯上我会这样做(你让我想象一下,在java中类里面的方法也是对象,可以被调用,然后这个方法还可以有自己的属性,这是多么不可想象的):

var myFunction = function func(name,age){
    this.name = name;
    this.age = age;
}

我以为我的真的给这个函数对象添加了name和age属性,但是实际上你要这样做:

var myFunction = function func(){
}
myFunction.name = 'myFunction';
myFunction.age = 19;
console.log(myFunction.name);
console.log(myFunction.age);

这时候你就会发现它跟你创建的其他普通对象是不一样的,比如:

var MyObject = function func(){
    this.name = 'name';
    this.age = 20
}
var my = new MyObject()
console.log(my.age);

你会想怎么这种对象会这么奇特,不是跟function对象添加属性是一样的

Function.method('new', function ( ) {
// Create a new object that inherits from the
// constructor's prototype.
    var that = Object.create(this.prototype);
// Invoke the constructor, binding –this- to
// the new object.
    var other = this.apply(that, arguments);
// If its return value isn't an object,
// substitute the new object.
    return (typeof other === 'object' && other) || that;
});

原因就是new这个操作符所做的操作跟上面这个函数是一样的

所以现在function对象跟其他的object对象就应该统一在一起了:

var myFunction = function func(){
}
myFunction.name = 'name';
myFunction.age = 29
myFunction.get_age = function(){
    console.log(this.age);
}
myFunction.get_age();

 函数还有一个特点就是他是可以被调用的,它被调用的时候this是根据上下文指向不同的对象

转载于:https://www.cnblogs.com/ghgyj/p/4006235.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值