一、与原始类型相比,对象的根本区别之一是对象是“通过引用”被存储和复制的,与原始类型值相反:字符串,数字,布尔值等 —— 始终是以“整体值”的形式被复制的。
二、复制值时发生了什么
1、原始类型,例如一个字符串。
(1)这里我们将message复制到phrase:
let message = "Hello!";
let phrase = message;
(2)结果我们就有了两个独立的变量,每个都存储着字符串”Hello!”。
(3)但是,对象不是这样的。
2、对象
赋值了对象的变量存储的不是对象本身,而是该对象“在内存中的地址”,换句话说就是对该对象的“引用”。
(1)让我们看一个这样的变量的例子:
let user = {
name: "John"
};
(2)这是它实际存储在内存中的方式:
(3)该对象被存储在内存中的某个位置(在图片的右侧),而变量user(在左侧)保存的是对其的“引用”。
(4)我们可以将对象变量(例如user)想象成一张带有地址的纸。
(5)当我们对对象执行操作时,例如获取一个属性user.name,JavaScript 引擎将对该地址进行搜索,并在实际对象上执行操作。
三、当一个对象变量被复制: 引用则被复制,而该对象并没有被复制。
let user = { name: "John" };
let admin = user; // 复制引用
1、现在我们有了两个变量,它们保存的都是对同一个对象的引用:
2、这里仍然只有一个对象,现在有两个引用它的变量。
3、我们可以通过其中任意一个变量来访问该对象并修改它的内容:
let user = { name: 'John' };
let admin = user;
admin.name = 'Pete'; // 通过 "admin" 引用来修改
alert(user.name); // 'Pete',修改能通过 "user" 引用看到
4、这就像我们有个带两把钥匙的柜子,并使用其中一把钥匙(admin)来打开它。那么,我们如果之后用另外一把钥匙(user),则也能看到更改。
通过this引用对象
一、JavaScript有一个特殊的关键字this,可以在方法中使用以指代当前对象。
【实例1】有一个名为validate的函数
// 根据给出的最大值、最小值检查某个对象的value属性
function validate(obj, lowval, hival) {
if ((obj.value < lowval) || (obj.value > hival)) {
alert('Invalid Value')
}
}
<!--通过this传入相应元素-->
<input type="text" name="age" size="3" onchange="validate(this, 18, 99)">
二、this在一个方法中指调用的对象
三、当与form属性一起使用时,this可以指代当前对象的父窗体。
【实例1】窗体 myForm 包含一个 Text 对象和一个按钮,当用户点击按键,Text 对象的值被设为窗体的名称。按钮的 onclick 事件处理器使用 this.form 以指代其父窗体,即 myForm
<form name="myForm">
<p><label>Form name:<input type="text" name="text1" value="Beluga"></label>
<p><input name="button1" type="button" value="Show Form Name"
onclick="this.form.text1.value = this.form.name">
</p>
</form>