javascript 面向对象(转)

1.使用[]调用对象的属性和方法



function User()
{
    this.age = 21;
    this.sex = "男?";
}
var user = new User();
alert(user["age"]);

2.动态添加,修改,删除对象的属性和方法
//定义类
var user = new Object();

//添加属性和方法
user.name = "cary";
user.age = 21;
user.show = function() {
    alert(this.name + "年?龄?为?:?" + this.age);
}
//执行方法
user.show();
//修改属性和方法
user.name = "James";
user.show = function()
{
    alert(this.name + "你?好?" );
}
//执行方法
user.show();
//删除属性和方法
user.name = "undefined";
user.show = "undefined"
//执行方法
user.show();
 
3.使用大括号{}语法创建无类型对象
var obj = {};
var user =
{
    name: "cary",
    age: 21,
    show: function() {
        alert(this.name + "年?龄?为?:?" + this.age);
    }
}
user.show();
var obj = {}; 等价于
var obj = new Object();
 
4.Prototype原型对象

每个函数function也是一个对象,对应的类类型为“Function”,每个函数对象都有一个子对象prototype,表示函数的原型,所以当我们new一个类的对象的时候prototype对象的成员都会被实例化为对象的成员。例如:
function class1()
{ }
class1.prototype.show = function() {
    alert("prototye member");
}

var obj = new class1();
obj.show();
5.Function函数对象详解
5.1.Function和Date,Array,String等一样都属于JavaScript的内部对象,这些对象的构造器是由JavaScript本身所定义的。上面说过函数对象对应的类型是Function,这个和数组的对象是Array一个道理。所以也可以像new Array()一样new Function()来创建一个函数对象,而函数对象除了使用这种方式还可以使用function关键字来创建。我们之所以不经常使用new Function()的方式来创建函数是因为一个函数一般会有很多语句,如果我们将这些都传到new Function()的参数中会显得可读性比较差。var functionName=new Function(p1,p2,...,pn,body)其中p1到pn为参数,body为函数体。
5.2.有名函数和无名函数
有名函数:function funcName(){}无名函数:var funcName=function(){}
他们之间的唯一区别:就是对于有名函数他可以出现在调用之后再定义,而对于无名函数,他必须是在调用之前就已经定义好。
5.3.我们可以利用Function的prototype对象来扩展函数对象,如:
Function.prototype.show = function() {
    alert("扩展方法");
}
function fun()
{ }
fun.show();
fun.show().show();
fun.show().show();

这句的意思是调用fun.show()这个函数对象的show方法。是一个递归的调用,因为fun.show()也是一个函数。

6.传递给参数的隐含参数arguments我们在使用函数时除了传递制定的参数,还创建了一个隐含的参数arguments,如下:
function fun(a, b) {
    for (var i = 0; i < arguments.length; i++) {
        alert(arguments[i]);
    }
}
fun(1,2,3);
arguments还有一个属性是callee,表示对函数对象本身的引用。

7.函数的apply,call方法

他们的作用都是将函数绑定到另外一个对象上去运行,两者只是在定义参数上有区别,如下:
Function.prototype.apply(thisArg,argArray);
Function.prototype.call(thisArg[,arg1[,arg2...]]);

下面是例子,obj1的show1方法绑定到obj2后整个函数的执行环境就转移到了obj2,所以this指针也就指向了obj2,所以会显示fun2t:

function fun1() {
    this.name = "fun1";
    this.show1 = function(arg) {
        alert(this.name + arg);
    }
}
function fun2() {
    this.name = "fun2";
    this.show2 = function(arg) {
        alert(this.name + arg);
    }
}

var obj1 = new fun1();
var obj2 = new fun2();

obj1.show1.apply(obj2, ["t"]);
obj1.show1.call(obj2, "t");

8.JavaScript中的类实现

8.1.命名空间:我们可以使用如下方式实现命名空间,namespace1 可以看做为命名空间。
var namespace1 = new Object();
namespace1.class1 = function() {
    //对?象初始化代码
}
var obj1 = new namespace1.class1();

8.2.类成员上面的我们已经为类添加了成员和方法,除了上面的方法我们还可以使用prototype的方式来给类添加成员,我们怎么做才是最合理的呢,首先来看下前面的方式:
function User() {
    //构造函数
}
//成员定义
User.prototype.name = "cary";
User.prototype.show = function() {
    alert(this.name);
}
上面的方式我们每定义一个类成员都要去写User.prototype,我们可以重构为下面的形式:
function User() {
    //构造函数
}
//成员定义
User.prototype =
{
    name : "cary",
    show = function()
    {
        alert(this.name);
    }
}

8.3.私有成员

实现类的私有成员主要是利用变量的作用域,我们在构造函数中实现。

function User() {
    //构造函数中定义私有成员
    var name="cary";
    function show()
    {
        alert(name);
    }
    //共有成员
    this.setname=function()
    {
        name="james";
    }
}
8.4.静态成员

我们可以通过给一个函数对象直接添加成员来实现静态成员,如:
function class1()
{ }
//静态属性和方法
class1.staticpr = "staticpr";
class1.staticmet = function()
{ }
//调用
class1.staticmet();
我们可以通过给函数对象所在的类Function添加成员来实现给所有的函数对象默认添加静态成员,如下:
Function.prototype.staticmet = function()
{ }
function class1()
{ }
//调用
class1.staticmet();

9.实现反射机制
使用for(...in...)方式,for中的var p来存储User对象的属性和方法,我们来判断是属性还是方法,如下:
function User() {
    //构造函数
}
//成员定义
User.prototype =
{
    name : "cary",
    show : function()
    {
        alert(this.name+"Hello");
    }
}
var u=new User();
for (var p in u) {
    if(typeof(u[p])=="function") {
        u[p]();
    }
    else {
        alert(u[p]);
    }
}
 


时间: 2024-10-17 11:47:53

javascript 面向对象(转)的相关文章

JavaScript面向对象及相关知识

最近在学习JavaScript面向对象,写下自己的理解及相关资料,以备查阅. 一.面向对象中涉及的相关几个概念 1.作用域 所谓作用域,就是说属性和函数的可访问范围.在JavaScript中,作用域分为两种.全局作用域和局部作用域. 所有没有var 声明 或 定义于最外层函数和最外层函数外面即为全局作用域.也就是定义可以随意调用. 自定义函数内部用var声明的为局部作用域. var num = 1; //全局作用域 window.onload = function() { //最外层为全局作用域

javascript面向对象之this指针

下午用面向对象的方法写一个幻灯片插件的时候不小心写出了这样的代码: Slider.prototype.auto=function() { setInterval(this.toRun,4000);//注意 } Slider.prototype.toRun=function() { if(this.iNow==this.aA.length - 1) ...... } 在浏览器打开的时候发现幻灯片不能如预期般自动切换,控制台给出了这样的错误提示: this.aA isundefined?然而我已经在

javascript面向对象2

原文:javascript面向对象2 首先我们先创建一个对象 var user = Object(); user.name = "张三"; user.age = 20; user.sex = "男"; 上面呢创建了一个对象,当然创建对象的方法有很多种,但是用这样的方法创建对象比较简单直观,也是JavaScript种创建对象最基本的方法. 同时呢也出现了另外一个弊端,当我们想要创建多个对象的时候,我们就要写很多重复的代码,这样一来就增加了代码量,减少了工作的效率, 为

JavaScript面向对象之类的继承

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效:但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends.implement).为了实现这些面向对象的特性,需要额外编写一些代码,如下.

[连载]JavaScript讲义(03)--- JavaScript面向对象编程

[连载]JavaScript讲义(03)--- JavaScript面向对象编程,布布扣,bubuko.com

Javascript面向对象编程(二):构造函数的继承

这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数. function Cat(name,color){ this.name = name; this.color = col

Javascript 面向对象编程(一):封装

学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学习笔记,希望对大家学习这个部分有所帮助.我主要参考了以下两本书籍: <面向对象的Javascript>(Object-Oriented JavaScript) <Javascript高级程序设计(第二版)>(Professional JavaScript for Web Developers, 2nd

javascript面向对象系列第一篇——构造函数和原型对象

× 目录 [1]构造函数 [2]原型对象 [3]总结 前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是用new创建对象时调用的函数,与普通唯一的区别是构造函数名应该首字母大写 function Person(){ this.age = 30; } var person1 = new Person(); console.log(person1.ag

《Javascript面向对象精要》笔记

刚读过<Javascript面向对象精要>这本书,在现有的知识体系里面有一些新鲜的认识,记录一下. 原始类型和引用类型 Javascript存在两种类型:原始类型和引用类型.原始类型包括String.Number.Boolean.Null.Undefined,引用类型保存对象,其本质是对象所在内存位置的引用. 原始类型的赋值或者给函数传参,实际上都是传递原始类型值的拷贝: 引用类型则是引用的拷贝.修改其中一个引用的话,其他引用也会受到影响.如果对象中的某个属性也是对象,在对象拷贝时就会引入深拷