之前一直有对一个方法定义在构造函数中不同的地方有什么区别不太理解,今天闲的无聊,就自己随变弄弄来加深自己的理解,例如下所示:
function Car(wheelNum){
this.wheelNum=num;
this.Wheel=function(){
alert(wheelNum);
};
};
Car.writeWheel=function(wheelNum){
alert(wheelNum);
};
Car.prototype.writeWheel2=function(wheelNum2){
alert(wheelNum2);
};
var car1=new Car(40);
car1.Wheel();//40;
Car.wheel();// Car.wheel is not a function;
Car.writeWheel(30);//30;
Car.writeWheel2(30);//Car.writeWheel2 is not a function;
car1.writeWheel2(50);//50
Car.writeWheel2(50);//Car.writeWheel2 is not a function
总结:
1:当方法定义在构造函数内部的this上的时候,要想调用该方法,需要使用实例化后的对象来调用,而不能直接使用构造函数来调用该方法;
2:当方法定义在类上的时候,则该方法只能被构造函数来调用,而不能被构造函数实例化后的对象来调用;
3:当方法定义在原型(prototype)上时,也是只能通过构造函数实例化后的对象来调用,如果使用构造方法来调用,则会提示XXXX is not a function;
4:对于2和1以及3的区别,现在应该是清楚了,但是对于1和3的区别呢?1和3定义的方法,都是不能通过构造函数来调用,而是要实例化后的对象来调用,那么他们之间有什么不一样呢?这里的话就需要对prototype有一定的了解了(不一定要很清楚,因为我自己也不是特别懂),通过1的方法定义的方法,在实例化多个对象的时候,同样的会把方法也会复制一遍(即每个实例化后的对象,都有一个方法),这样的话,当需要该构造函数实例化很多对象的时候,每一个实例化后的对象的方法都要占用一定的内存,这样就会导致内存开销太大了;而通过prototype来定义的方法,在实例化对象的时候,都只是在每个对象中复制了一个指向该方法的一个指针,所以实际上,占用的内存只有一个方法,所以对比两者的话,使用prototype来定义方法的话,可以节省很多的内存开销;那么是不是有了后者就不要前者了呢?并不是这样的,在构造函数里面,定义的变量有私有变量(即通过var 定义的变量)和公有变量(即通过this来定义的变量),因为私有变量不能被外界访问,所以我们需要有可以在外界访问私有变量的途径,而在构造函数里面通过this定义的方法可以有效的访问私有变量;
所以在实际工作的项目中,我们可以根据自己的实际需求来定义将方法放在哪里;
以上是个人的一些理解,如有理解错误的,欢迎大家来纠正
相关推荐
在JavaScript编程中,构造函数和原型prototype是实现面向对象编程的关键特性,它们允许开发者以一种更加结构化和模块化的方式组织代码。为了深入理解这两个概念及其用途,下面将详细阐述构造函数和原型的相关知识点...
在构造函数内部,可以通过this关键字定义在新对象上需要共享的属性和方法。 在JavaScript中,每个对象都有一个原型对象(prototype),原型对象本身也是一个对象,并且有一个特殊的属性constructor,这个属性指向...
- **缺点**: 如果将方法的声明写在构造函数内部,则每次创建对象时都会执行该方法声明,导致每个对象里面包含一个功能相同但独立的方法实例,造成资源浪费。 #### 构造函数基础 1. **构造函数定义**: - 构造函数...
本文将详细解释JavaScript中构造函数中公有、私有特权成员以及静态成员的定义和使用方法。 构造函数中的成员可以被分为公有成员和私有成员。公有成员指的是那些可以被对象外部访问的属性和方法,而私有成员则是只能...
JavaScript定义类的几种方式包括工厂方式、构造函数和原型方式,每种方法都有其特点和适用场景,接下来我们将详细探讨。 工厂方式是最早期的面向对象编程在JavaScript中的实践之一。使用工厂方式定义类,本质上就是...
要解决这个问题,可以将方法定义在构造函数外部,然后将其引用赋值给实例的属性: ```javascript function sayName() { alert(this.name); } function Person(name, age, job) { this.name = name; this.age...
注意:当在外部定义方法时,如果希望方法能够访问对象的内部属性,通常需要使用 `bind` 方法或其他方法确保 `this` 的正确指向。 #### 四、实例分析 我们以第一个示例为例进行更详细的分析: 1. **构造函数定义**...
当我们把方法定义在构造函数的`prototype`上,例如`ListCommon2.prototype.do2 = function() {...}`,这个方法被所有实例共享,只存储一份。这意味着无论创建多少个实例,都不会为每个实例创建方法副本,节省了内存...
可以为构造函数添加静态属性和方法,静态属性和方法是直接定义在构造函数上的,而不是实例上。 在JavaScript中,实例化对象时,并不能在其.prototype属性上添加属性或方法。这会导致编译错误,因为.prototype属性是...
例如,在全局作用域中调用函数,`this`指向全局对象(在浏览器环境中是`window`),在方法调用中,`this`指向调用该方法的对象。而在构造函数调用中,`this`指向新创建的实例。 - **箭头函数**:箭头函数不具有自己...
- **私有属性**:在构造函数内部定义,外部无法直接访问。 - **实例属性**:在对象实例化后通过`this`定义,可以被实例方法访问。 - **对象属性**:通过`prototype`定义,可以被所有实例共享。 - **类属性**:...
1. 全局作用域:在函数外部定义的变量在整个脚本中都是可见的。 2. 局部作用域:在函数内部定义的变量只在其所在函数内可见。 3. 闭包:当函数可以访问并操作其外部作用域的变量时,就形成了闭包。闭包常用于数据...
`new`操作符实际上执行了几个步骤:创建一个新对象,将新对象的`[[Prototype]]`链接到构造函数的`prototype`,然后在新对象上执行构造函数,并返回新对象。此外,我们还可以通过`call`或`apply`方法模拟`new`的行为...
- **全局作用域**:在任何函数外部定义的变量在整个脚本中都是可见的。 7. 函数表达式与函数声明 - 函数表达式是在运行时创建函数,而函数声明在代码解析阶段就会被创建,这意味着在函数声明之前调用该函数是可行...
JS特权方法是一种特殊的构造函数方法,它通过使用this关键字在构造函数内部进行定义。这种做法使得特权方法可以被实例化的对象继承,并且可以在对象外部被调用。但是,值得注意的是,特权方法只能由通过该构造函数...
JavaScript中的函数对象调用模式是编程中至关重要的概念,它涉及到函数作为一等公民、作用域、闭包、原型链等多个核心知识点。这篇博客通过深入分析JavaScript中的函数调用模式,帮助开发者更好地理解和掌握这些概念...
虽然不常用,但JavaScript也允许使用`new Function()`构造函数定义函数: ```javascript var functionName = new Function('param1', 'param2', '...paramN', 'functionBody'); ``` 这种方式不太推荐,因为它的...
这使得实例可以访问构造函数`prototype`上的方法和属性。 例如: ```javascript function ConstructorFn() {} ConstructorFn.prototype.fn = function() {}; var obj = new ConstructorFn(); obj.fn(); // 调用了...