安静100分钟理解js面向对象

<!DOCTYPE html>
<html>
 <head>
 <meta charset="utf-8">
 <title></title>
 </head>
 <body>
 </body>
</html>
<script>
 window.onload=function(){
 //安静100分钟来理清js对象,以及类的生成
 //深入理解对象原型与constructor
 //1-----------------------------------------
 //定义一个对象
 function obj(){
 }
 //对象需要一些共用方法,下面通过原型继承
 obj.prototype.name="name";
 obj.prototype.say=function(){
 console.log("h1");
 };
 var obj1=new obj();//实例对象
 console.log(obj1.name);
 obj1.say();
 //上面的方法跑起来一切正常,但是还有另一种方法;
 //2---------------------------------------------------
 function obj2(){
 }
 //专门定义一个放原型对象里面的属性与方法的对象
 //然后在空对象里面添加需要的属性与方法,再赋给真正的原型
 var prototype_test={};
 prototype_test={
 name:"name2",
 say:function(){
 console.log("h2");
 }
 }
 obj2.prototype=prototype_test;
 var obj2=new obj2();//实例对象
 console.log(obj2.name);
 console.log(obj2.constructor);
 obj2.say;
 //这样定义的原型对象,好像比较方便,也容易控制,但是这个原型对象的constructor很明显会指向另一个空对象,而不是本身的obj2
 //原本原型对象的构造器会指向原型本身的。
 //3++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 //于是就有意给原型对象,添加一个叫constructor的属性,避免访问构造器的时候,指向那个空对象。
 function obj3(){
 }
 var prototype_test={};
 prototype_test={
     constructor:obj3,//增加一个属性,指向本身
 name:"name2",
 say:function(){
 console.log("h2");
 }
 };
 obj3.prototype=prototype_test;
 var obj3=new obj3();//实例对象
     console.log(obj3.constructor);
     //这样定义的原型,里面所有的属性与方法都可以被枚举for in
     //原本的构造器虽然是对象的属性,但是并不会被枚举,
 //4---------------------------------------------
 //在高版本浏览器中支持一个重新定义对象的构造器的函数,可以用这个函数给一个对象定义一个指定的构造器
 //可以配置是否被被枚举,就像原生的一样。
 Object.defineProperty(obj,"constructor",{//需要被指定构造器的对象
 enumerable:false,//是否被枚举
 value:obj//指定的构造器
 })
 //5===========================================================
 //原型链的动态特征
 function obj4(){
 }
 var obj4=new obj4();
  obj4.prototype={
 name:"name4"
 }
 //console.log(obj4.name);//这里打印会报错,因为在原型没有给定属性name的时候,以及实例对象obj4,所以obj4并不会有name这个属性
 //6-----------------------------------------
 //规范定义类
 function obj5(name,age,sex){
 this.name=name;
 this.age=age;
 this.sex=sex;
 }
 obj5.prototype={
 constructor:obj5,//指向本身的原型构造器
 say_name:function(){
 console.log(this.name);
 }
 }
  var obj5=new obj5("obj5",33,"none");
  obj5.say_name();
 //7-------------------------------------------------
 //便捷方式,动态模式
 //把原型写在函数内部
  function obj6(name,age,sex){
 this.name=name;
 this.age=age;
 this.sex=sex;
 if(typeof this.say_name!='function'){
   obj6.prototype.say_name=function(){
   console.log(this.name);
   }
  }
 }
  var obj6=new obj6("obj6",33,"none");
  obj6.say_name();
 //8---------------------------------------------
 //安全模式,对象的闭包
 function obj7(name){
  var obj=new Object();
  var name=name;
  obj.say_name=function(){
  console.log(name);
  }
  return obj;
 }
 var obj7=new obj7("name7");
 obj7.say_name();
 }
</script>

原文发布于微信公众号 - 交互设计前端开发与后端程序设计(interaction_Designer)

原文发表时间:2015-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

深入理解Java中静态初始化块

在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。

9720
来自专栏Golang语言社区

Go 语言循环语句

在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。 以下为大多编程语言循环程序的流程图: ? Go 语言提供了以下几种类型循环处...

38470
来自专栏程序员互动联盟

【java基础】Java中instanceof关键字的理解

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或...

36390
来自专栏C/C++基础

C++中基类私有成员会被继承吗

在类的继承中,类的私有成员在派生类中是“不可见“的,这种”不可见“是指在派生类的成员函数中,或者通过派生类的对象(指针,引用)不能直接访问它们。但是,不能直接访...

11020
来自专栏java一日一条

java语言核心----面向对象之this关键字

9630
来自专栏武军超python专栏

2018年9月9日正则表达式随堂记

*********************** 今天遇到的新单词: element n元素,要素 multibyte n多字节 sequence n数列...

13140
来自专栏锦小年的博客

python学习笔记4.1-python高级之生成器

生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。 如果一个函数包含yield关键字,这个函数就会变...

23090
来自专栏十月梦想

each()list()while遍历数组

each()函数:需要一个数组作为参考,each函数返回1,0,key,value键值,0,key返回键,1,value对应的值,

11010
来自专栏java初学

static关键字

308100
来自专栏null的专栏

C/C++——set的基本操作总结

set容器中只能存储键,是单纯的键的集合,其中键是不能重复的。 set支持大部分的map的操作,但是set不支持下标的操作,而且没有定义mapped_type...

31630

扫码关注云+社区

领取腾讯云代金券