博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js的面向对象编程
阅读量:5880 次
发布时间:2019-06-19

本文共 4049 字,大约阅读时间需要 13 分钟。

原创作品,允许转载,转载时请务必以超链接形式标明文章   、作者信息和本声明。否则将追究法律责任。
JavaScript 对象是词典
在JAVA中,说到的【对象】指类或结构的实例。对象有不同的属性和方法,具体取决于将它们实例化的模板(即类)。而 JavaScript 对象却不是这样。在 JavaScript 中,对象只是一组名称/值对,就是说,将 JavaScript 对象视为包含字符串关键字的词典。我们可以使用熟悉的“.”(点)运算符或“[]”运算符,来获得和设置对象的属性,这是在处理词典时通常采用的方法。
 
 1.创建对象的方法
//第一种方法 
var    obj = 
new Object(); 
obj.name=
"randy"
//alert(obj.name); 
//第二种方法 
var    obj = {}; 
obj.name=
"zhao"
//alert(obj["name"]); 
//第三种方法 
var obj ={
"name":
"test"}; 
//alert(obj.name); 
 
2. 创建函数的方法
function func1(str){ 
    alert(str); 
  
//alert(this.name); //name 是我在之后添加的一个属性,但是不能在fun1()方法体中访问,及时this.name 也不行 
var func2 = 
function(str){ 
  alert(
"hello "+str); 
var func3 = 
new Function(
"str",
"alert(str);");
//您可以在运行时构造任意函数。 
var func4 ={ 
  
"firstname":
"name1"
  
"lastname":
"zhao"
  
"display":
function(){ 
    alert(
this.firstname+
":"+
this.lastname); 
  }, 
  
"display2":
function(){ 
    alert(
this.firstname); 
  } 
}
 
可以为函数添加属性
func1.name =
"天苍苍"
//alert(func1.name); 
 
 
JS 中函数的特点:
JavaScript 中的函数是对象。每个函数对象都有一个名为 call 的方法,它将函数作为第一个参数的方法进行调用。就是说,作为函数第一个参数传递给 call 的任何对象都将在函数调用中成为“this”的值。这一技术对于调用基类构造函数来说非常有用.
绝不要调用包含“this”(却没有所属对象)的函数。否则,将违反全局命名空间,因为在该调用中,“this”将引用全局对象,而这必然会给您的应用程序带来灾难。
 
4.构造方法
function DogConstructor(name) { 
  
this.name = name; 
  
this.respondTo = 
function(name) { 
    
if(
this.name == name) { 
      alert(
"Woof"); 
    } 
  }; 
}
在上面的构造函数中,发现每个 Dog 实例也都有它自己的 respondTo 方法副本,这是个浪费;您只需要一个可供各个 Dog 实例共享的 respondTo 实例!通过在 Dog 以外定义 respondTo,可以避免此问题。但是还存在问题:这样会造成很多的全局函数,而且随着"类"的增加,会很严重。所以,可以用下面的方法实现。
function respondTo() { 
// respondTo definition 
function Dog(name) { 
this.name = name; 
// attached this function as a method of the object 
this.respondTo = respondTo; 
}
 
5.原型
注意:JavaScript 中,本来就没有类
在使用 JavaScript 的面向对象编程中,原型对象是个核心概念。
在 JavaScript 中对象是作为现有示例(即原型)对象的副本而创建的,该名称就来自于这一概念。
 
function Dog(){ 
    
this.name =
"小黑"
Dog.prototype.display = 
function(){alert(
this.name);} 
Dog.prototype.toString = 
function() {
return 
"name:"+
this.name;} 
var dog = 
new Dog(); 
alert(dog);
此原型对象的任何属性和方法都将显示为从原型的构造函数创建的对象的属性和方法。可以说,这些对象从其原型继承了属性和方法。
var buddy = new Dog(“Buddy“);
buddy 所引用的对象将从它的原型继承属性和方法,对象 buddy 的原型来自构造函数(在这里是函数 Dog)的属性。 
在 JavaScript 中,每个函数都有名为“prototype”的属性,用于引用原型对象。
此原型对象又有名为“constructor”的属性,它反过来引用函数本身。这是一种循环引用。
正如 Dog 实例继承 Dog.prototype 一样,Dog.prototype 继承 Object.prototype。这使得所有 Dog 实例也继承了 Object.prototype 的方法和属性。每个 JavaScript 对象都继承一个原型链,而所有原型都终止于 Object.prototype。注意,迄今为止您看到的这种继承是活动对象之间的继承。它不同于继承的常见概念,后者是指在声明类时类之间的发生的继承。因此,JavaScript 继承动态性更强。它使用简单算法实现这一点,如下所示:当您尝试访问对象的属性/方法时,JavaScript 将检查该属性/方法是否是在该对象中定义的。如果不是,则检查对象原型。如果还不是,则检查该对象的原型的原型,如此继续,一直检查到 Object.prototype。
 
6.静态方法
function DateTime() { } 
    
  DateTime.now = 
function() { 
    
return 
new Date(); 
  }; 
  DateTime.now2 = 
new Date(); 
  
//alert(DateTime.now()); 
  
//alert(DateTime.now2);
 
7.闭包
  
function makeGreaterThanPredicate(lowerBound) { 
    
return 
function(numberToCheck) { 
          
return (numberToCheck > lowerBound) ? 
true : 
false
      }; 
  }
 
 闭包是当内部函数(或 C# 中的内部匿名方法)绑定到它的外部函数的本地变量时所发生的运行时现象。很明显,除非此内部函数以某种方式可被外部函数访问,否则它没有多少意义。该匿名内部函数使用 lowerBound,后者是传递给 makeGreaterThanPredicate 的参数。按照作用域的一般规则,当 makeGreaterThanPredicate 退出时,lowerBound 超出了作用域!但在这里,内部匿名函数仍然携带 lowerBound,甚至在 makeGreaterThanPredicate 退出之后的很长时间内仍然如此。这就是我们所说的闭包:因为内部函数关闭了定义它的环境(即外部函数的参数和本地变量)。
 
8. 【类】的私有变量
function Person(name, age) { 
    
this.getName = 
function() { 
return name; }; 
    
this.setName = 
function(newName) { name = newName; }; 
    
this.getAge = 
function() { 
return age; }; 
    
this.setAge = 
function(newAge) { age = newAge; }; 
         
    
var occupation; 
     
    
this.age =age; 
    
this.getOccupation = 
function() { 
return occupation; }; 
    
this.setOccupation = 
function(newOcc) { occupation =newOcc; }; 
  Person.prototype.display = 
function() { 
    
// doesn’t work! 
     alert(
this.name);
//unidefined 
     alert(
this.age); 
//ok 
    
// this one below works 
    alert(
this.getName()); 
//ok 
}; 
  
var person = 
new Person(
"赵",24); 
  person.display(); 
在代码中,可以简单理解为name 为私有变量。
 
9.模拟命名空间,相当于java 中的package
 
var com = {}; 
// nested namespace “Examples” 
com.randy = {}; 
com.randy.Pet = 
function(name) {    
    
this.name = name; 
}; 
com.randy.Pet.prototype.toString = 
function() { 
  
return 
this.name; 
}; 
var pet = 
new com.randy.Pet(
"Yammer"); 
alert(pet);

本文出自 “” 博客,请务必保留此出处

你可能感兴趣的文章
CentOS 5 全功能WWW服务器搭建全教程
查看>>
scala111
查看>>
模块化服务规范——OSGI
查看>>
劣质代码评析——猜数字问题(上)
查看>>
纸上谈兵: 栈 (stack)
查看>>
Windows phone8 基础篇(三) 常用控件开发
查看>>
Oracle学习笔记之五,Oracle 11g的PL/SQL入门
查看>>
大叔手记(3):Windows Silverlight/Phone7/Mango开发学习系列教程
查看>>
考拉消息中心消息盒子处理重构(策略模式)
查看>>
so easy 前端实现多语言
查看>>
【追光者系列】HikariCP源码分析之ConcurrentBag&J.U.C SynchronousQueue、CopyOnWriteArrayList...
查看>>
在navicat中如何新建连接数据库
查看>>
canvas系列教程05-柱状图项目3
查看>>
css绘制几何图形
查看>>
HTML标签
查看>>
理解JS中的Event Loop机制
查看>>
转载:字符编码笔记:ASCII,Unicode和UTF 8
查看>>
修复看不懂的 Console Log
查看>>
Android跨进程通信 AIDL使用
查看>>
ajax常见面试题
查看>>