开发者社区> ghost丶桃子> 正文

js的面向对象编程

简介:
+关注继续查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dba10g.blog.51cto.com/764602/230117
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);

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/230117

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
js (ES5)如何面向对象编程?
js (ES5)如何面向对象编程?
31 0
JavaScript 面向对象编程思想简介
JavaScript 面向对象编程思想简介
51 0
JavaScript之面向对象编程
面向对象编程(Object-oriented programming, OOP)是一种程序设计范型。它将对象作为程序的基本单元,将程序和数据封装其中,以提高程序的重用性、灵活性和扩展性。
236 0
+关注
ghost丶桃子
文章
问答
视频
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
在 IoT 设备进行 JavaScript 开发的探索之路
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多