浅析JS构造函数
构造函数(Constructor Function)是 JavaScript 中创建对象的一种重要方式,它不仅让我们能够创建具有相似属性和方法的对象,还能充分利用 JavaScript 的原型继承机制,实现代码的高效复用。本文将深入探讨构造函数的原理、使用方法、与类的关系,以及一些高级用法和注意事项。
构造函数的基本原理
构造函数本质上是一个普通的函数,但有以下几点特征使其区别于其他函数:
- 命名约定:构造函数通常以大写字母开头,以便与普通函数区分开来。
- 使用
new
关键字:构造函数必须与new
关键字一起调用,这样才能创建一个新的对象实例。 this
绑定:在构造函数内部,this
关键字指向新创建的对象实例。
构造函数的使用方法
下面是一个简单的构造函数示例,用于创建 Person
对象:
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};
} const person1 = new Person('Alice', 30);
const person2 = new Person('Bob', 25); person1.sayHello(); // 输出: Hello, my name is Alice and I am 30 years old.
person2.sayHello(); // 输出: Hello, my name is Bob and I am 25 years old.
在这个例子中,Person
构造函数为每个实例创建了 name
和 age
属性,以及一个 sayHello
方法。
构造函数与原型
每个函数在创建时,都会有一个 prototype
属性,这个属性是一个对象,包含了该构造函数实例共享的属性和方法。利用原型对象,我们可以避免在每次创建实例时都重新定义方法,从而节省内存。
function Person(name, age) {
this.name = name;
this.age = age;
} Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}; const person1 = new Person('Alice', 30);
const person2 = new Person('Bob', 25); person1.sayHello(); // 输出: Hello, my name is Alice and I am 30 years old.
person2.sayHello(); // 输出: Hello, my name is Bob and I am 25 years old. console.log(person1.sayHello === person2.sayHello); // 输出: true
通过将 sayHello
方法添加到 Person.prototype
,我们确保了所有 Person
实例共享同一个 sayHello
方法,而不是为每个实例创建一个新的方法。
构造函数与类(Class)
ES6 引入了类(class)语法,使得定义构造函数和原型方法更加简洁和易读。类实际上是构造函数的语法糖,本质上还是使用了原型机制。
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
} sayHello() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
} const person1 = new Person('Alice', 30);
const person2 = new Person('Bob', 25); person1.sayHello(); // 输出: Hello, my name is Alice and I am 30 years old.
person2.sayHello(); // 输出: Hello, my name is Bob and I am 25 years old.
类的定义使得构造函数和原型方法的语法更加直观,减少了理解和维护的难度。
高级用法与注意事项
1. 使用 Object.create
进行继承
构造函数和原型可以结合 Object.create
方法实现继承:
function Animal(name) {
this.name = name;
} Animal.prototype.speak = function() {
console.log(`${this.name} makes a noise.`);
}; function Dog(name, breed) {
Animal.call(this, name); // 调用父构造函数
this.breed = breed;
} Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; Dog.prototype.speak = function() {
console.log(`${this.name} barks.`);
}; const dog = new Dog('Rex', 'Labrador');
dog.speak(); // 输出: Rex barks.
通过 Object.create
方法,我们可以创建一个新的对象,并将其原型设置为指定的对象,从而实现继承。
2. 静态方法
构造函数也可以定义静态方法,静态方法是直接绑定在构造函数上的,而不是实例对象上:
function Person(name, age) {
this.name = name;
this.age = age;
} Person.isAdult = function(age) {
return age >= 18;
}; console.log(Person.isAdult(20)); // 输出: true
console.log(Person.isAdult(16)); // 输出: false
在 ES6 类语法中,可以使用 static
关键字定义静态方法:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
} static isAdult(age) {
return age >= 18;
}
} console.log(Person.isAdult(20)); // 输出: true
console.log(Person.isAdult(16)); // 输出: false
浅析JS构造函数的更多相关文章
- 浅析JS中的模块规范(CommonJS,AMD,CMD)////////////////////////zzzzzz
浅析JS中的模块规范(CommonJS,AMD,CMD) 如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. ...
- JS构造函数的用法和JS原型
$(function(){ var rec = new Rectangle(5, 10); //alert(rec.width + "*" + rec.height + " ...
- 谈谈JS构造函数
//构造函数 //使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法 //当对象被实例化后,构造函数会立即执行它所包含的任何代码 function myObject(msg) ...
- Class和普通js构造函数的区别
Class 在语法上更加贴合面向对象的写法 Class 实现继承更加易读.易理解 更易于写 java 等后端语言的使用 本质还是语法糖,使用 prototype Class语法 typeof Math ...
- js 构造函数 & 静态方法 & 原型 & 实例方法
js 构造函数 & 静态方法 & 原型 & 实例方法 ES5 "use strict"; /** * * @author xgqfrms * @licens ...
- 深入研究js构造函数和原型
很快就要从新浪离职了,最近心情比较轻松,抽点空整理一下构造函数和原型的机理. 我们都知道,在经典设计模式中我们最常用的就是工厂模式.构造函数模式.原型模式这几种,听起来‘模式’好像很高大上的样子,实际 ...
- js构造函数,索引数组和属性的属性
本文主要介绍和小结js的构造函数,关联数组的实现方式和使用,及不可变对象和它的实现方式及他们使用过程中要注意的点 <script> function p(){ var len=argume ...
- JS构造函数原理与原型
1.创建对象有以下几种方式: ①.var obj = {}; ②.var obj = new Object(); ③.自定义构造函数,然后使用构造函数创建对象 [构造函数和普通函数的区别:函数名遵循大 ...
- js 构造函数(construction)与原型(prototype)
1.面向对象:js原型 java有class和instance,js仅仅有构造函数(function Cat(name,age){this.name=name;this.age=age}),为了实现数 ...
- JS构造函数、对象工厂、原型模式
1.对象创建的3中方法 1.1.对象字面量 var obj = { name: "mingzi", work: function () { console.log("wo ...
随机推荐
- Django——基于forms组件和ajax的注册功能
path('register/',views.register) #注册的form表单 from django import forms from django.forms import widget ...
- 分享一个关于Avl树的迭代器算法
1 研究过程 前段时间在研究avl树的迭代实现,在节点不使用parent指针的情况下,如何使用堆栈来实现双向地迭代.我参考了网络上的大部分迭代器实现,要么是使用了parent指针(就像c++的map容 ...
- swift_slowAlloc Crash 分析
一.Crash详情 Crash类型 exception EXC_BREAKPOINT (SIGTRAP) reason EXC_BREAKPOINT EXC_ARM_BREAKPOINT fault_ ...
- this,构造器,static,final,单例模式
this关键字 在java中this是一个引用变量,即指向当前对象地址的引用(指针),→可以把this当作当前对象,便于更好的索引. this() 实际是调用了当前对象的构造器 1. 引用当前对象的属 ...
- gRPC入门学习之旅(九)
gRPC入门学习之旅目录 gRPC入门学习之旅(一) gRPC入门学习之旅(二) gRPC入门学习之旅(三) gRPC入门学习之旅(四) gRPC入门学习之旅(七) 3.10.客户端编译生成GRP ...
- ko编译常见问题
记录ko编译过程中遇到的常见问题: (1)找不到标准库头文件 解决方式:将lib库中的头文件链接到编译内核中.
- 字符型 ASCLL编码 转义字符
字符(character) char 2字节 每一个字符的背后.都有一个数字做代表(对照,参照的表) 字符赋值 char cl = 'a';通过''单引号描述为字符赋值 整数赋值 char c2 ...
- springboot之日志配置-logback
springboot之日志配置-logback 1.为什么使用logback logback是springboot默认集成的,是基于Sl4J的日志框架. logback的内核重写了,使得在某些关键路径 ...
- mysql ON DUPLICATE KEY UPDATE 演示
<e>查询:INSERT INTO member_test(mem_no,flag)VALUE('111','1') 错误代码: 1062Duplicate entry '111' for ...
- Isolution
<template> <div style="float:left;width: 100%; margin-left: 0"> <el-row > ...