Prototype

1、  当声明一个函数的时候,浏览器会自动为该函数添加一个属性prototype,

2、  该属性的默认值为{}

3、  可以动态的给prototype增加key和value值

4、  另外一种形式动态添加key,value值

Json

动态的给json添加属性

第一种方式

第二种方式

动态的遍历json

Extends

第一种

 function Person(){

 }
Person.prototype.setName = function(name){
this.name = name;
}
Person.prototype.getName = function(){
return this.name;
} var p = new Person();
p.setName("aaaa"); function Student(){ }
/**
* 让Student继承Person
*/
Student.prototype = Person.prototype;
Student.prototype = new Person();

extend.js

第二种

 /**
* 定义一个函数,该函数传递一个json格式的对象,返回值为一个函数
* var Person = extend({
* a:'a',
* b:'b'
* })
* var p = new Person();
*/ function extend(json){
function F(){ }
/**
* 遍历传递过来的json格式的对象
* 把json对象的每一个key,value值传递给F的prototype
*/
for(var i in json){
F.prototype[i] = json[i];
}
return F;
} var Person = extend({
a:'a',
b:'b'
});
var p = new Person();
alert(p.a);
alert(p.b);

extend2.js

说明:F为在函数内部定义的函数,用Person来接收,也就是说在函数内部定义的函数,在外部使用,这种现象为闭包,所以继承的封装是闭包的一种应用。

第三种

 /**
* 写一个函数extend
* var Person = extend({
* aa:'aa',
* bb:'bb'
* });
* Student继承了Person,扩充了一个json对象
* var Student = extend(Person,{
* cc:'cc',
* dd:'dd'
* });
*/
function extend(json,prop){
function F(){
}
/**
* json是一个对象
* 该if语句是第一次调用extend执行的
*/
if(typeof json == "object"){
for(var i in json){
//把json对象中的每一个key,value赋值给F的prototype
F.prototype[i] = json[i];
}
} /**
* json是一个函数
* 该if语句是第二次调用extend执行的
*/
if(typeof json == "function"){
/**
* 把json的prototype的属性的引用赋值给F的prototype
*/
F.prototype = json.prototype;
/**
* 把传递过来的prop对象的每一个key,value赋值给F的prototype
*/
for(var i in prop){
F.prototype[i] = prop[i];
}
}
return F;
} var Person = extend({
a:'a',
b:'b'
});
var p = new Person();
alert(p.a);
alert(p.b);
var Student = extend(Person,{
c:'c',
d:'d'
});
var s = new Student();
alert(s.a);
alert(s.c);

extend3.js

 /**
* extends(a,b)
如果a是json对象,b是json对象,则把b赋值给a
如果a是函数,b是json对象,则把b赋值给a的prototype
如果a是json对象,b是函数,则把b的prototype的内容赋值给a
如果a是函数,b是函数,则把b的prototype中的内容赋值给a的prototype
*/
function extend(prop1,prop2){
//prop1是一个对象
if(typeof prop1 == "object"){
//prop2是一个对象
if(typeof prop2 == "object"){
//把prop2的每一个key,value赋值给prop1
for(var i in prop2){
prop1[i] = prop2[i];
}
}
//prop2是一个函数
if(typeof prop2 == "function"){
//把prop2函数的prototype属性的key,value赋值给prop1
for(var i in prop2.prototype){
prop1[i] = prop2.prototype[i];
}
}
}
//prop1是一个函数
if(typeof prop1 == "function"){
//prop2是一个对象
if(typeof prop2 == "object"){
for(var i in prop2){
prop1.prototype[i] = prop2[i];
}
}
//prop2是一个函数
if(typeof prop2 == "function"){
for(var i in prop2.prototype){
prop1.prototype[i] = prop2.prototype[i];
}
}
}
return prop1;
} var json = extend({},{a:'a',b:'b'});
alert(json.b);
function Student(){ }
Student.prototype.name = 5;
var json2 = extend({},Student);
alert(json2.name);

extend3.js

说明:完成了一个创建函数,并且在此基础上进行了扩充。

事件

事件的声明1

利用该方法声明事件不能防止事件被叠加

事件的声明2

unbind和bind不能给未来元素添加事件

事件的声明3

说明:

    给body下的所有的div添加一个事件:click。

这些div不管是页面加载完毕以后就有的还是后来添加上的都可以添加事件。

闭包

概念

在函数中定义的函数,在外部要使用

使用场景

继承

见继承

可以做到函数的私有性和公开性

 (function(){
/**
* 在外部能够访问getName,getSex,init方法,但是不能够访问setName,setSex
*/
var data = {
name:'',
sex:'',
};
function Person(){
/**
* json对象中的key,value的内容就是将来要公开的api
*/
return {
getName:getName,
getSex:getSex,
init:init
};
}
//私有方法
function setName(name){
data.name = name;
}
//私有方法
function setSex(sex){
data.sex = sex;
}
function getName(){
return data.name;
}
function getSex(){
return data.sex;
}
function init(name,sex){
setName(name);
setSex(sex);
}
//Person函数赋值给了window的一个属性,这样外部就能访问了
window.Person = Person;
})();
var p = window.Person();
p.init("aaa","bbb");
alert(p.getName());
alert(p.getSex());

close1.js

 (function(){
/**
* Person模块
*/
var Person = {
/**
* 数据
*/
data:{
name:'',
sex:''
},
/**
* 操作的部分
*/
opt:{
getName:function(){
return Person.data.name;
},
setName:function(name){
Person.data.name = name;
},
getSex:function(){
return Person.data.sex;
},
setSex:function(sex){
Person.data.sex = sex;
},
init:function(name,sex){
Person.opt.setName(name);
Person.opt.setSex(sex);
}
},
/**
* 公开api
*/
openAPI:function(){
return {
getName:Person.opt.getName,
getSex:Person.opt.getSex,
init:Person.opt.init
};
}
};
window.Person = Person;
})();
var p = window.Person.openAPI();
p.init("aa","bb");
alert(p.getName());
alert(p.getSex());

close2.js

Jquery的内核

(function(window){
//jQuery是一个函数,一个对象,一个构造器函数
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
},
//定义了jQuery的prototype的内容
//fn=prototype
//加在jQuery的prototype上的方法可以通过选择器创建出来的对象调用
jQuery.fn = jQuery.prototype = { 对象方法
ready:function(){ },
each:function(){ }
},
//post方法和extend方法直接加在了jQuery对象上 全局方法
jQuery.post = function(){ },
jQuery.extend = function(){ }
//程序员在用jQuery的时候,是window的一个属性
//jQuery=$
window.jQuery = window.$ = jQuery;
$.fn=jQuery.prototype=window.$.prototype=window.$.fn=window.jQuery.fn=window.jQuery.prototype 加在jQuery的prototype上的方法和加在jQuery对象上的方法称为jQuery的插件开发
})(window);

Jquery的插件开发

 (function($){
$.myconfirm = function(){
//获取到当前页面所有的超级链接
$("a").each(function(){
//如果是删除的超级链接,则添加click事件
if($(this).text()=="删除"){
$(this).unbind("click");
$(this).bind("click",function(){
return window.confirm("您确认要删除吗?");
});
}
});
}
})($);
$().ready(function(){
$.myconfirm();
});

jquery-plugin-confirm.js

 (function(jQuery){
jQuery.fn.myeach = function(callback){
//this为$("div")
var array = $(this);
for(var i=0;i<array.length;i++){
/**
* 该回调函数是由正在遍历的每一个对象
*/
callback.call(array[i]);
}
}
jQuery.myeach = function(obj,callback){
var array = obj;
for(var i=0;i<array.length;i++){
/**
* 该回调函数是由正在遍历的每一个对象
*/
callback.call(array[i]);
}
}
})(jQuery); $().ready(function(){
$("div").myeach(function(){
//输出每一个div中的内容
alert($(this).text());
}); jQuery.myeach($("div"),function(){
//输出每一个div中的内容
alert($(this).text());
});
});

jquery-plugin-each.js

组件开发

Table案例

 [
{
pid:'1',
name:'a1',
sex:'b1'
},{
pid:'2',
name:'a2',
sex:'b2'
},{
pid:'3',
name:'a3',
sex:'b3'
}
]

person.json

 $().ready(function(){
/**
* 1、创建命名空间 com.itheima09.oa.system.DepartmentGrid
* 2、把jQuery.fn.GridPanel赋值给DepartmentGrid
* 3、利用DepartmentGrid的createTable方法创建表格
*/
$.nameSpace("com.itheima09.oa.system.DepartmentGrid");
$.extend(com.itheima09.oa.system.DepartmentGrid,jQuery.fn.GridPanel);
com.itheima09.oa.system.DepartmentGrid.methods.createTable({
url:'person.json'
});
});

table_componet.js

 <!DOCTYPE html>
<html>
<head>
<title>table.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head>
<script src="../js/jquery-1.4.2.js"></script>
<script src="jQuery-plugin-table.js"></script>
<body>
<table id="personTable" border="1" cellpadding="5" cellspacing=0>
<tbody>
<tr>
<th item="pid">id</th>
<th item="sex">性别</th>
<th item="name">姓名</th>
</tr>
</tbody>
</table>
</body>
</html>

table.html

 /**
* 做一个插件$.fn.GridPanel = {
* //该组件内部用到的参数
* defaults:{
* url:''
* },
* //该json对象存放所有的方法
* methods:{
* //创建表格
* createTable:function(){
*
* },
* //创建tr
* createTR:function(){
*
* },
* //创建td
* createTD:function(){
*
* }
* }
* };
* GridPanel是一个组件
* 在该组件中把表格的增加、删除、修改、查询的方法全部包含了
*/
(function(jQuery){
//组件
jQuery.fn.GridPanel = {
//参数的默认值
defaults:{
url:''
},
methods:{
createTable:function(config){
/**
* config为程序员传递过来的参数
* 把config中的内容覆盖掉defaults的内容
*/
$.extend(jQuery.fn.GridPanel.defaults,config);
//发出ajax请求,请求一个url,返回一个json格式的对象,用于动态的拼接表格
$.post(jQuery.fn.GridPanel.defaults.url,null,function(data){
var jsonObj = eval("("+data+")");
//循环jsonObj的每一个对象
$.each(jsonObj,function(){
//循环了多少次,创建多少个tr
var $tr = jQuery.fn.GridPanel.methods.createTR(this);
$("tbody").append($tr);
});
/**
* [
{
pid:'1',
name:'a1',
sex:'b1'
},{
pid:'2',
name:'a2',
sex:'b2'
},{
pid:'3',
name:'a3',
sex:'b3'
}
]
*/
});
},
//jsonObj中有多少个对象,就有多少个tr
/*
* trObj
* {
pid:'1',
name:'a1',
sex:'b1'
}
*/
createTR:function(trObj){
var $tr = $("<tr></tr>");
/**
* 循环遍历所有的th
* <th item="pid">id</th>
<th item="name">姓名</th>
<th item="sex">性别</th>
*/
var arrayTH = $("table *[item]");
/*
* 遍历所有的th,有多少th就有多少td
*/
$.each(arrayTH,function(){
var $th = $(this);//当前正在遍历的th
//每遍历一次创建一个td
//$th.attr("item") pid/name/sex
jQuery.fn.GridPanel.methods.createTD($tr,trObj[$th.attr("item")]);
});
return $tr;
},
createTD:function(tr,value){
var $td = $("<td></td>").text(value);
tr.append($td);
}
}
};
})(jQuery);

jQuery-plugin-table.js

 /**
* nameSpace("com.itheima09.oa.system.DepartmentGrid")
* window.com.itheima09.oa.system.DepartmentGrid
*/
(function($){
$.nameSpace = function(namespace){
//把com.itheima09.oa.system.DepartmentGrid变成一个数组
var array = namespace.split(".");
var temp = [];
for(var i=0;i<array.length;i++){
temp.push(array[i]);
eval("window."+temp.join('.')+"={}");
}
}
})($);

jQuery-plugin-namespace.js

namespace.html
table_component.html

JavaScript高级特征之面向对象笔记二的更多相关文章

  1. JavaScript高级特征之面向对象笔记

    Javascript面向对象 函数 * Arguments对象: * Arguments对象是数组对象 * Arguments对象的length属性可以获取参数的个数 * 利用Arguments对象模 ...

  2. 《JavaScript 高级程序设计》读书笔记二 使用JavaScript

    一   <script>元素 a.四个属性: async:立即异步加载外部脚本: defer:延迟到文档完全被解析再加载外部脚本: src:外部脚本路径: type:脚本语言的内容类型: ...

  3. 《JavaScript高级程序设计》学习笔记(5)——面向对象编程

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...

  4. 《JavaScript高级程序设计》学习笔记12篇

    写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的 ...

  5. JS面向对象笔记二

    菜单导航,<JS面向对象笔记一>,  参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...

  6. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  7. 《JavaScript高级程序设计》学习笔记

    系统学习JS, 从<JavaScript高级程序设计>入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端 ...

  8. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  9. JavaScript高级程序设计(读书笔记)(一)

    本笔记汇总了作者认为“JavaScript高级程序设计”这本书的前七章知识重点,仅供参考. 第一章 JavaScript简介 JavaScript发展简史: 1995年,JavaScript诞生 19 ...

随机推荐

  1. APP项目下载及运行

    1.首先下载Git 2.再下载安装node.js 3.dos窗口下载node.js依赖jar包 执行命令:npm install 4.从Git上down项目 5.运行项目 在项目根目录下 右键 打开 ...

  2. Win2012或Win2016安装网卡

    在电脑安装了Windows Server 2012或者2016等系统之后,可能面临的很大的问题就是没有有线或无线网卡. 1.安装网卡的功能 2.一直到“功能”这部分,选择安装“DirectPlay”和 ...

  3. Java - Java 命令行简介: 选项, 属性, 参数

    概述 简单介绍一下 java 命令行相关的参数及属性 1. java 命令行 基本 命令 > java <mainClass> 描述 执行 Java 类 需要准备好编译完成的 mai ...

  4. CSS学习(5)更多的选择器

    1.通配符选择器 * 表示选中所有元素 *{color:red;} 2.属性选择器  根据属性名和属性值选中元素 https://developer.mozilla.org/zh-CN/docs/We ...

  5. python练习:编写一个程序,检查3个变量x,y,z,输出其中最大的奇数。如果其中没有奇数,就输出一个消息进行说明。

    python练习:编写一个程序,检查3个变量x,y,z,输出其中最大的奇数.如果其中没有奇数,就输出一个消息进行说明. 笔者是只使用条件语句实行的.(if-else) 重难点:先把三个数进行由小到大的 ...

  6. Steam游戏《Nine Parchments(九张羊皮纸)》修改器制作-[先使用CE写,之后有时间的话改用C#](2020年寒假小目标02)

    日期:2020.01.09 博客期:122 星期四 [温馨提示]: 只是想要修改器的网友,可以直接点击此链接下载: 只是想要部分CT文件的网友,可以直接点击此链接下载: 没有博客园账号的网友,可以将页 ...

  7. maven搭建父子项目

    父工程:父工程又称为父控制器,只是一个简单的工程,不能单独运行.作用是将子模块跟子工程聚合在一起.父控制器中的pom.xml配置,在子模块跟子工程中都可以被继承. 子工程:项目中创建的具有业务逻辑并且 ...

  8. java 实现一段文字中,出现次数最多的字

    代码如下: public static void main(String[] args) { String str = "大批量,之前都没怎么注意过,这个问题确实不会,网上参考了下别人的,大 ...

  9. Activiti工作流学习之概述(一)

    一.工作流介绍 我第一次听到这个词,是蒙逼的,再看百度百度,更傻眼了,完全说的不像人话啊,举几个生活中的例子,就明白多了比如:请假.报销等等,如果文字太过抽象,请看图: 二.工作流引擎 Process ...

  10. How to Start Learning Computer Graphics

    Background Input\Output Image Knowledge Image Digital Image Processing Computer Vision Knowledge Com ...