在 js 中 , 每个函数都是 Function 类型的实例,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针(函数的名字仅仅是一个包含指针的变量而已)。
定义方式:
function test() { } // 这是函数声明方式
var test = function(){ }; // 这是函数表达式
这两个 test 就是包含指针的变量
还有一种方式:
var test = new Function(num1,num2,"return num1+num2");
在参数中最后一位是函数体,前面可以是多位参数
这一方式对于理解 函数是对角,函数名是指针 的概念是非常直观的
Function 对象是没有属性与方法的,但是, 因为它本身也是函数,所以它也会通过原型链从Function.prototype上继承部分属性和方法。
原型对象(Function.prototype)
属性:
Function.arguments
Function.length
Function.prototype.constructor
方法
Function.prototype.call()
Function.prototype.toString()
等还有一些没有完整举例出来 , 可到以下地址查看
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function
Function 实例从 Function.prototype 继承了一些属性和方法。
如:
{
function Product(name) {}Product.prototype.price = 100;var o = new Product('婚沙')console.log(o.price); // 这里会输出 100
}
这里还有一个特性就是优先选择
{
function Product(name,price) {this.price = price;}Product.prototype.price = 100;var o = new Product('婚沙',2000)console.log(o.price); // 这里会输出2000
}
换一种说法 Function.prototype(属性) 这个关键定就是存储 Function 的原型对象。
在看一实例:
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
console.log(new Food('cheese', 5).name); // expected output: "cheese"
原型方法 call 主要是改变(扩展)调用函数的作用域
Product 函数体中并没有定义 call 方法,当 Product.call 调用时,这个实例通过原型链的查找机制找到Function.prototype上的call方法,让找到的call方法执行