`
jobar
  • 浏览: 346890 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

面向对象的JS(3) 对象创建和成员作用域

    博客分类:
  • OOJS
 
阅读更多
一 对象创建
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面向对象的支持

    JavaScript是一种广泛应用于Web开发的脚本语言,它虽然支持面向对象编程,但其面向对象的实现方式与其他传统面向对象语言(如Java或C++)有所不同。JavaScript中的面向对象特性主要体现在以下几个方面: 1. **基于...

    Javascript面向对象基础

    在JavaScript中,面向对象编程(Object-Oriented Programming,OOP)是其核心概念之一,帮助开发者创建复杂、可复用和易于维护的代码结构。下面我们将详细探讨JavaScript面向对象的基础知识。 1. **对象和数据类型*...

    韩顺平 javascript 笔记 js面向对象 笔记 韩顺平 完整版

    在韩顺平的JavaScript笔记中,他深入讲解了JS面向对象编程的各个方面,包括变量的作用域、对象引用、this关键字的使用以及对象的方法。 首先,变量的作用域在JavaScript中是一个关键概念。带var和不带var声明的变量...

    JS面向对象教程(DOC)

    封装则通过作用域和闭包机制实现,私有成员和方法可以通过闭包保持私密性,只通过公共接口访问。 #### 五、多态与动态绑定 多态性在JavaScript中主要体现在方法的重写上。由于JavaScript是动态类型语言,一个对象...

    javascript面向对象特性代码实例.docx

    除此之外,JavaScript还支持其他面向对象特性,如封装(通过作用域和闭包实现)、多态(通过函数重写和鸭子类型实现)等。在实际开发中,理解并灵活运用这些特性是编写高效、可维护的JavaScript代码的关键。为了更好...

    JavaScript 面向对象的之私有成员和公开成员

    在JavaScript中,面向对象编程是一种广泛使用的设计模式,允许开发者通过创建“对象”来封装数据和函数。这些对象通常拥有私有成员和公开成员,它们对对象外部代码的可见性和访问性有着不同的规则。尽管JavaScript...

    浅析JavaScript面向对象编程的实现.pdf

    本文将深入探讨JavaScript如何实现面向对象编程,包括封装、继承和多态。 1. JavaScript的封装性实现 在JavaScript中,类的声明通常通过函数来实现。每个函数可以视为一个类,函数内部的局部变量相当于类的成员...

    JS 创建对象(常见的几种方法)

    JavaScript作为一门面向对象的脚本语言,其...由于没有类和块级作用域等传统面向对象语言的特性,JavaScript的设计者们利用原型链、作用域链和闭包等概念来弥补这些不足,这些概念也被后来的开发者们广泛地使用和扩展。

    JavaScript 面向对象的 私有成员和公开成员

    JavaScript中的面向对象编程是一种强大的设计模式,它允许我们创建具有属性和方法的对象,模拟类的概念。在JavaScript中,没有像Java或C++那样的类结构,而是通过构造函数和原型链来实现面向对象特性。本文将重点...

    浅析js封装和作用域

    JavaScript中的作用域分为全局作用域和局部作用域。局部作用域又可以分为函数作用域和块作用域。 #### 1. 全局作用域 全局作用域中的变量和函数可以在代码中的任何位置被访问。全局作用域是顶级作用域。 #### 2. ...

    Javascript面向对象编程

    作为一门面向对象的语言,JavaScript允许程序员通过封装、继承和多态等面向对象的概念来组织和构建代码。然而,许多人可能只是将其视为一种函数式语言,用于简单的数据验证和页面动态效果,而没有充分利用其面向对象...

    JS中的public和private对象,即static修饰符

    在C#等静态类型语言中,public、private和static是访问修饰符,用于控制类成员的可见性和作用域。而在JavaScript中,由于其原型继承的特性,我们通常使用函数作用域和闭包来模拟这些行为。 下面我们将基于提供的...

    php面向对象的技术好代码

    面向对象编程(Object-Oriented Programming,简称OOP)是现代软件开发中的重要概念,它通过封装、继承和多态等核心特性,帮助开发者构建更复杂、更健壮的应用。 1. **封装**:封装是面向对象编程的基础,它将数据...

    javascript 设计模式之单体模式 面向对象学习基础

    这种模式在JavaScript中尤其重要,因为JavaScript是全局作用域的语言,容易导致变量冲突。单体模式可以帮助解决这个问题,通过创建一个全局变量来作为整个应用的核心,其他所有相关组件都通过这个全局变量进行交互,...

    JavaScript面向对象核心知识与概念归纳整理

    - **键值对与属性和方法**:键值对是JavaScript对象的基础,值为数据的部分是属性,值为函数的部分是方法。 - **父类与子类**:虽然JavaScript没有类的概念,但可以通过原型链模拟父类和子类的关系,实现继承。 4...

    java面向对象考题和标准答案.doc

    码的输出结果是: ```java ...这些题目涵盖了 Java 中的一些基本概念,如方法调用、变量作用域、内存管理、继承、构造方法以及运算符优先级等,这些都是学习 Java 面向对象编程时必须掌握的关键知识点。

Global site tag (gtag.js) - Google Analytics