Nodejs中Js原型的使用问题请教

Nodejs中Js原型的使用问题请教

function js(){

} js.prototype.show1=function(){} js.show2=function(){}

为什么 show1 方法这样 js.show1() 调用会报show1方法不存在的错误,而 js.show2( )却不报错,show1方法好像必须实例化调用 new js().show1();???

6 回复

当然可以。让我们来详细探讨一下 Node.js 中 JavaScript 的原型机制以及 show1show2 方法的不同之处。

原型链的基本概念

在 JavaScript 中,每个函数都有一个 prototype 属性,这个属性指向一个对象,该对象的用途是为该函数的所有实例提供共享的属性和方法。当你通过 new 关键字创建一个对象实例时,这个实例会继承构造函数的原型上的属性和方法。

示例代码

function Js() {
    // 构造函数内部定义的方法或属性
}

// 在原型上定义方法
Js.prototype.show1 = function () {
    console.log('This is show1 method');
};

// 直接在构造函数上定义静态方法
Js.show2 = function () {
    console.log('This is show2 method');
};

// 创建实例
const instance = new Js();

// 调用方法
instance.show1(); // 正常工作
Js.show2();       // 正常工作

解释

  1. show1 方法:

    • 这个方法被定义在 Js.prototype 上。
    • 当你通过 new Js() 创建一个实例时,这个实例将能够访问 show1 方法。
    • 如果直接通过 Js.show1() 来调用,这将会导致错误,因为 show1 方法并没有被添加到构造函数本身上,而是添加到了它的原型对象上。
  2. show2 方法:

    • 这个方法被直接定义在 Js 函数本身上。
    • 因此,你可以通过 Js.show2() 来直接调用它,不需要创建实例。

错误原因

  • 当你尝试通过 Js.show1() 调用时,JavaScript 会查找 Js 对象本身的属性,但 show1 方法并不在这个对象上,而是在它的原型上。因此,会报错。
  • Js.show2() 是有效的,因为它确实存在于 Js 对象本身上。

总结

  • show1 方法应该通过实例来调用,即 new Js().show1()
  • show2 方法是一个静态方法,可以直接通过构造函数来调用,即 Js.show2()

希望这些解释和示例代码能帮助你理解在 Node.js 中如何正确地使用原型和静态方法。


这个属于初级知识了,建议你去看一些学习JS的书籍补充补充。

简单的说,JS中有一个“原型链”——prototype,在prototype上增加的属性只在他新创建的对象中可以调用。

see


function MyClass(){}

MyClass.prototype.a = function(){} // public method.

MyClass.b = function(){} // static method.

call:


var obj = new MyClass();

obj.a(); 

MyClass.b();  // call static metho b


签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

第2种类似静态成员,第一种是实例方法

哦,懂了,类似于java中类的静态变量和成员变量,看来我是要好好补充下js基础知识啦

在Node.js中,JavaScript的原型链机制决定了如何定义和调用方法。你的代码中有两个函数定义,一个是通过prototype定义的方法,另一个是直接定义在构造函数上的静态方法。理解这两者的区别对于正确使用它们非常重要。

show1 方法

js.prototype.show1 = function() {}

这段代码将show1方法定义为js构造函数的原型方法。这意味着当创建js的实例时(使用new js()),这些方法将会被继承到实例上。但是,如果直接尝试通过构造函数本身调用这个方法(如js.show1()),它将不会找到该方法,因此会报错。

show2 方法

js.show2 = function() {}

这段代码将show2方法定义为js构造函数的一个静态方法。这意味着show2方法是直接添加到了js构造函数本身上,而不是它的原型。所以可以直接通过js.show2()来调用这个方法,而不会有任何问题。

示例代码

function js() {}

// 定义原型方法
js.prototype.show1 = function() {
    console.log("This is show1 method.");
};

// 定义静态方法
js.show2 = function() {
    console.log("This is show2 static method.");
};

const instance = new js();

instance.show1(); // 正确输出: This is show1 method.
js.show2();       // 正确输出: This is show2 static method.

// 错误示范
// js.show1(); // 报错: js.show1 is not a function

总结

  • 使用js.prototype.methodName定义的方法需要实例化后才能调用。
  • 使用js.methodName定义的方法可以直接通过构造函数调用,不需要实例化。
回到顶部