一 对象创建
1 使用new操作符
内置或自定义的对象类型的实例可以用new操作符创建。new操作符只运行构造函数,已存在的对象不能用new再创建一次。首先new操作符创建一个空对象;然后调用构造函数同时将新创建的对象赋值给this,构造函数执行其初始化工作。
//or var dog = {};
//or var dog = new MyDogType();
var dog = new Object();
dog.name = "Scooby";
dog.owner = {};
dog.owner.name = "Mike";
dog.bark = function () {
return "Woof";
};
console.log(dog.name); // Scooby
console.log(dog.owner.name); // Mike
console.log(dog.bark()); // Woof
2 对象字面量创建
由对象字面量创建对象很容易,且可以创建嵌套对象。
var dog = {
name: "Scooby?",
owner: {
name: "Mike"
},
bark: function () {
return" Woof";
}
};
console.log(dog.name); // Scooby
console.log(dog.owner.name); // Mike
console.log(dog.bark()); // Woof
二 成员作用域
1 私有字段
在JavaScript中,没有内置的私有字段支持。但我们可以用封闭的构造函数来实现。定义于构造函数内的变量可以作为私有字段。任何使用私有字段的方法应该在构造函数内定义。请注意,原型方法不能在构造函数中声明和使用私有字段。私有的geter和setter方法应该在构造函数中声明。
function Customer() {
// private field
var risk = 0;
this.getRisk = function () {
return risk;
};
this.setRisk = function (newRisk) {
risk = newRisk;
};
this.checkRisk = function () {
if (risk > 1000)
return" Risk Warning";
return" No Risk";
};
}
Customer.prototype.addOrder = function (orderAmount) {
this.setRisk(orderAmount + this.getRisk());
return this.getRisk();
};
var customer = new Customer();
console.log(customer.getRisk()); // 0
console.log(customer.addOrder(2000)); // 2000
console.log(customer.checkRisk()); // Risk Warning
2 私有方法
也称为"嵌套"或"内部函数"。私有方法定义在另一个函数内且不能从外部访问。私有方法可以在函数的任何部分声明。
function Customer(name) {
var that = this;
var risk = 0;
this.name = name;
this.type = findType();
// private method
function findType() {
console.log(that.name);
console.log(risk);
return" GOLD";
}
}
或者
function Customer(name) {
var that = this;
var risk = 0;
this.name = name;
// private method
var findType = function () {
console.log(that.name);
console.log(risk);
return" GOLD";
};
this.type = findType();
}
var customer = new Customer("ABC Customer"); // ABC Customer
// 0
console.log(customer.type); // GOLD
console.log(customer.risk); // undefined
如果一个私有内部函数返回给外部调用者,那么就可以从外部调用。
function Outer() {
return new Inner();
//private inner
function Inner() {
this.sayHello = function () {
console.log('Hello');
}
}
}
(new Outer()).sayHello(); // Hello
3 特权方法
原型方法不能访问私有字段;原型方法都是pulbic的。我们需要一种方法来声明方法
(1)可以公共访问这些方法
(2)可以访问私有成员。
这意味着特权或受保护的访问。请看下面的代码:
function Customer(orderAmount) {
// private field
var cost = orderAmount / 2;
this.orderAmount = orderAmount;
var that = this;
// privileged method
this.calculateProfit = function () {
return that.orderAmount - cost;
};
}
Customer.prototype.report = function () {
console.log(this.calculateProfit());
};
var customer = new Customer(3000);
customer.report(); // 1500
4 公有字段
对于公有字段,原型或实例都可以使用。原型字段和方法是通过new实例共享。原型对象也是共享的。如果一个实例改变了它的对象的字段或方法,该变化并不会影响其他实例。要改变所有实例下,我们需要改变它的原型对象。
function Customer(name, orderAmount) {
// public fields
this.name = name;
this.orderAmount = orderAmount;
}
Customer.prototype.type = "NORMAL";
Customer.prototype.report = function () {
console.log(this.name);
console.log(this.orderAmount);
console.log(this.type);
console.log(this.country);
};
Customer.prototype.promoteType = function () {
this.type = "SILVER";
};
var customer1 = new Customer("Customer 1", 10);
// public field
customer1.country = "A Country";
customer1.report(); // Customer 1
// 10
// NORMAL
// A Country
var customer2 = new Customer("Customer 2", 20);
customer2.promoteType();
console.log(customer2.type); // SILVER
console.log(customer1.type); // NORMAL
5 公有方法
原型方法是公有的。任何定义在this上的方法也是公有的。
function Customer() {
// public method
this.shipOrder = function (shipAmount) {
return shipAmount;
};
}
// public method
Customer.prototype.addOrder = function (orderAmount) {
var totalOrder = 0;
for (var i = 0; i < arguments.length; i++) {
totalOrder += arguments[i];
}
return totalOrder;
};
var customer = new Customer();
// public method
customer.findType = function () {
return" NORMAL";
};
console.log(customer.addOrder(25, 75)); // 100
console.log(customer.shipOrder(50)); // 50
console.log(customer.findType()); // NORMAL
分享到:
相关推荐
在编程领域,对象的作用域是理解面向对象编程(OOP)的关键概念之一。它涉及到一个变量或对象在程序中的可见性和生命周期,对于代码组织、内存管理和数据安全性具有重要意义。本章示例代码将深入探讨对象作用域的...
JavaScript是一种广泛应用于Web开发的脚本语言,它虽然支持面向对象编程,但其面向对象的实现方式与其他传统面向对象语言(如Java或C++)有所不同。JavaScript中的面向对象特性主要体现在以下几个方面: 1. **基于...
在JavaScript中,面向对象编程(Object-Oriented Programming,OOP)是其核心概念之一,帮助开发者创建复杂、可复用和易于维护的代码结构。下面我们将详细探讨JavaScript面向对象的基础知识。 1. **对象和数据类型*...
在韩顺平的JavaScript笔记中,他深入讲解了JS面向对象编程的各个方面,包括变量的作用域、对象引用、this关键字的使用以及对象的方法。 首先,变量的作用域在JavaScript中是一个关键概念。带var和不带var声明的变量...
封装则通过作用域和闭包机制实现,私有成员和方法可以通过闭包保持私密性,只通过公共接口访问。 #### 五、多态与动态绑定 多态性在JavaScript中主要体现在方法的重写上。由于JavaScript是动态类型语言,一个对象...
除此之外,JavaScript还支持其他面向对象特性,如封装(通过作用域和闭包实现)、多态(通过函数重写和鸭子类型实现)等。在实际开发中,理解并灵活运用这些特性是编写高效、可维护的JavaScript代码的关键。为了更好...
在JavaScript中,面向对象编程是一种广泛使用的设计模式,允许开发者通过创建“对象”来封装数据和函数。这些对象通常拥有私有成员和公开成员,它们对对象外部代码的可见性和访问性有着不同的规则。尽管JavaScript...
本文将深入探讨JavaScript如何实现面向对象编程,包括封装、继承和多态。 1. JavaScript的封装性实现 在JavaScript中,类的声明通常通过函数来实现。每个函数可以视为一个类,函数内部的局部变量相当于类的成员...
JavaScript作为一门面向对象的脚本语言,其...由于没有类和块级作用域等传统面向对象语言的特性,JavaScript的设计者们利用原型链、作用域链和闭包等概念来弥补这些不足,这些概念也被后来的开发者们广泛地使用和扩展。
JavaScript中的面向对象编程是一种强大的设计模式,它允许我们创建具有属性和方法的对象,模拟类的概念。在JavaScript中,没有像Java或C++那样的类结构,而是通过构造函数和原型链来实现面向对象特性。本文将重点...
JavaScript中的作用域分为全局作用域和局部作用域。局部作用域又可以分为函数作用域和块作用域。 #### 1. 全局作用域 全局作用域中的变量和函数可以在代码中的任何位置被访问。全局作用域是顶级作用域。 #### 2. ...
作为一门面向对象的语言,JavaScript允许程序员通过封装、继承和多态等面向对象的概念来组织和构建代码。然而,许多人可能只是将其视为一种函数式语言,用于简单的数据验证和页面动态效果,而没有充分利用其面向对象...
在C#等静态类型语言中,public、private和static是访问修饰符,用于控制类成员的可见性和作用域。而在JavaScript中,由于其原型继承的特性,我们通常使用函数作用域和闭包来模拟这些行为。 下面我们将基于提供的...
面向对象编程(Object-Oriented Programming,简称OOP)是现代软件开发中的重要概念,它通过封装、继承和多态等核心特性,帮助开发者构建更复杂、更健壮的应用。 1. **封装**:封装是面向对象编程的基础,它将数据...
这种模式在JavaScript中尤其重要,因为JavaScript是全局作用域的语言,容易导致变量冲突。单体模式可以帮助解决这个问题,通过创建一个全局变量来作为整个应用的核心,其他所有相关组件都通过这个全局变量进行交互,...
- **键值对与属性和方法**:键值对是JavaScript对象的基础,值为数据的部分是属性,值为函数的部分是方法。 - **父类与子类**:虽然JavaScript没有类的概念,但可以通过原型链模拟父类和子类的关系,实现继承。 4...
码的输出结果是: ```java ...这些题目涵盖了 Java 中的一些基本概念,如方法调用、变量作用域、内存管理、继承、构造方法以及运算符优先级等,这些都是学习 Java 面向对象编程时必须掌握的关键知识点。