构造函数:
构造函数是一种特殊类型的函数,用于初始化新创建的对象实例。当使用new
关键字创建一个对象的实例时,构造函数被调用,并且这个新对象会成为构造函数的this
上下文。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
// 使用构造函数创建一个新对象
var myCar = new Car('Toyota', 'Camry', 2005);
new实例化执行
-
创建一个新的空对象:JavaScript首先会创建一个新的空对象。这个对象将是你要实例化的对象的原型(prototype)的一个实例。通常,构造函数的
prototype
属性会被设置为新创建对象的[[Prototype]]
内部链接。这意味着新创建的对象可以访问构造函数的prototype
对象上的属性和方法。 -
设置构造函数的
this
上下文:接下来,JavaScript会将新创建的对象设置为构造函数的this
上下文。这意味着在构造函数内部,你可以使用this
关键字来访问和修改新创建对象的属性和方法。 -
执行构造函数:然后,JavaScript会执行构造函数的代码。在这个过程中,你可以定义新对象的属性和方法,通过
this
关键字来引用和修改它们。 -
返回新对象:如果构造函数没有显式地返回一个对象,那么
new
表达式的结果就是新创建的对象。如果构造函数返回了一个非原始值(即一个对象或函数),那么这个返回值会成为new
表达式的结果。如果构造函数返回了一个原始值(如undefined
、null
、数字、字符串或布尔值),那么new
表达式的结果仍然是新创建的对象。
实例成员
在JavaScript中,实例成员是指在构造函数内部通过this
关键字添加的属性或方法。这些成员只能由实例化的对象来访问。
实例成员是在每次创建新对象时都会初始化的,它们存储在每个对象实例自己的内存中,而不是共享在原型或其他地方。这意味着每个对象实例都有它自己的实例成员副本。
class MyClass {
constructor() {
实例属性
this.instanceProperty = 'I am an instance property';
实例方法
this.instanceMethod = function() {
console.log(this.instanceProperty);
};
}
}
创建实例
const instance1 = new MyClass();
const instance2 = new MyClass();
访问实例成员
console.log(instance1.instanceProperty); // 输出: I am an instance property
instance1.instanceMethod(); // 输出: I am an instance property
修改实例成员不会影响其他实例
instance2.instanceProperty = 'Different value';
console.log(instance2.instanceProperty); // 输出: Different value
console.log(instance1.instanceProperty); // 输出: I am an instance property
静态成员
在JavaScript中,静态成员是指直接定义在构造函数或类本身上的属性和方法,而不是定义在实例上的。静态成员可以通过构造函数或类名直接访问,而不需要创建类的实例。
对于使用构造函数定义的类,你可以通过在构造函数外部添加属性和方法来创建静态成员。而在ES6的类中,可以使用static
关键字来定义静态成员。
class MyClass {
静态属性
static staticProperty = 'I am a static property';
静态方法
static staticMethod() {
console.log(this.staticProperty);
}
constructor() {
实例属性和方法...
}
}
访问静态成员
console.log(MyClass.staticProperty); // 输出: I am a static property
MyClass.staticMethod(); // 输出: I am a static property
创建实例
const instance = new MyClass();
// 实例不能访问静态成员(除非显式地通过类名访问)
包装对象
包装对象(Wrapper Objects)是一种特殊的对象,它们将基本类型值(primitive values)封装为对象,以便能够对这些基本类型值使用对象的方法。JavaScript提供了三种基本类型的包装对象:Number
、String
和Boolean
。
使用 Number 包装对象
var num = 123;
var str = num.toString(); // 自动转换为 Number 包装对象并调用其 toString 方法
console.log(str); // 输出: "123"
使用 String 包装对象
var strValue = "hello";
var upperCase = strValue.toUpperCase(); // 自动转换为 String 包装对象并调用其 toUpperCase 方法
console.log(upperCase); // 输出: "HELLO"
使用 Boolean 包装对象
var boolValue = true;
var boolObj = new Boolean(boolValue); // 显式地创建 Boolean 包装对象
构造函数封装
封装(Encapsulation)是面向对象编程的四大基本特性之一,它指的是隐藏对象的内部状态,并通过明确的接口暴露有限的访问方式。在JavaScript中,通过构造函数和原型链可以实现封装。
function Person(name, age) {
// 私有变量
var privateName = name;
var privateAge = age;
// 公有方法
this.getName = function() {
return privateName;
};
this.getAge = function() {
return privateAge;
};
this.setAge = function(newAge) {
if (newAge >= 0) {
privateAge = newAge;
} else {
console.log("Invalid age");
}
};
}
// 创建Person对象
var john = new Person("John", 25);
// 访问公有方法
console.log(john.getName()); // 输出: John
console.log(john.getAge()); // 输出: 25
// 修改私有变量(通过公有方法)
john.setAge(30);
console.log(john.getAge()); // 输出: 30
// 尝试直接访问私有变量(失败)
// console.log(john.privateName); // undefined
// console.log(john.privateAge); // undefined
原型对象和对象原型
原型对象(Prototype Object)
每个函数都有一个prototype
属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。简单来说,原型对象就是用来存放实例对象共享的方法和属性的地方。
对象原型(Object Prototype)
每个对象实例都有一个内部链接(__proto__
),指向它的构造函数的prototype
对象。这个链接是对象实例能够访问其原型对象上的属性和方法的机制。对象原型就是对象实例内部链接所指向的那个原型对象。
原型继承,原型链,instanceo运算符
原型继承
原型继承是 JavaScript 中实现对象继承的主要方式。当一个对象试图访问它的一个属性时,如果这个对象自身没有这个属性,JavaScript 就会在该对象的原型(也就是它的 __proto__
属性所指向的对象)上查找这个属性,如果还没有找到,就会继续在这个原型的原型上查找,以此类推,直到找到这个属性或者达到原型链的顶端(通常是 Object.prototype
),如果仍然没有找到,就会返回 undefined
。
原型链
原型链是 JavaScript 中实现原型继承的机制。每个对象都有一个指向它的原型的内部链接(__proto__
),而原型对象本身也是一个对象,也有自己的原型,这样一层一层地链接下去,就构成了原型链。当访问一个对象的属性时,JavaScript 就会沿着这条原型链向上查找,直到找到这个属性或者到达原型链的顶端。
instanceof
运算符
instanceof
运算符用于检测一个对象是否是一个特定类型的实例。它接受两个参数:左边是要检测的对象,右边是一个构造函数或者一个由 new
关键字生成的构造函数的原型对象。instanceof
运算符会检查对象的原型链上是否存在这个构造函数的 prototype
属性,如果存在,就返回 true
,否则返回 false。