zoukankan      html  css  js  c++  java
  • js--面向对象

    脚本:缩短 编写,编译,链接,运行 过程的语言,逐行解析,简单的,难以理解的(js基于原型的面向对象)

    解析型/编译型语言:前者需要解析器,后者会编译为二进制可执行文件

    对象:脚本都是简单的,但其中的面向对象绝对是初学者的噩梦,不明白其中的对象规则总会数据丢失,无法接受,未定义甚至this是什么都不知道(这个真不知道...)

    this.b=b; 
    this.c=c;
    return this; 
    } 
    
    function A2(b,c){    
    var a=new Object(); 
    a.b=b; 
    a.c=c; 
    return a; 
    } 
    function A3(){ } A3.prototype.a='a'; A3.prototype.b='b';

    以上三种都是创建对象的方式,第一种一眼看很好理解,但也最难理解,因为this是难以确定的

    第二种基于工厂,但所有属性与方法完全重新创建,方法需要写在方法体外,而写在方法体外又会很纠结

    function A2(b,c){    
    var a=new Object(); 
    a.b=b; 
    a.c=c; 
    a.d=d;
    return a; 
    } 
    
    function d(){
    alert("fun");
    }

    var a=A2(1,2); //var a=new A2(1,2); 拥有d方法,但是写多了就会发现无论是看法还是写法都很不舒服

    第三种基于原型,在new A3()时,所有属性赋予要创建的对象,完全无压力的解决的一二的别扭方法问题,不过创建对象怎么可以没有构造参数呢

    第四种混合搭配,即以第二中的方式创建属性,在基于原型创建方法,但是高手们认为,在构造方法外创建方法是不可理喻,不够有好的方式,固有了最终的标准写法

    第五种,理念与第四种一样,就是创建的位置不一样...

    function Person(name){
    this.name = name;
    if(typeof Person._initialized == 'undefined'){
    Person.prototype.say= function(){
    alert(this.name);
    }
    }
    
    Person._initialized = true;
    }

    好的,标准的构造方法就这么形成了,至于_initialized....说白了就是一个标识属性(单例,你懂得)

    第六种:json...某种程度上就是js的数组和对象,所以另一种给被新手接受的方式就出来了,当然既然要以面向对象的方式考虑js,更多的使用第五种才是正解(Ext中源码多使用第五种,使用Ext的大多使用第六种,就这个区别)

    必包:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。(标准答案,相当文艺,但不过白话,虽然是基于原型的面向对象,不过还是可以用java中的方式来理解),以下例子大部分为抄袭,具体地址可以度娘

    function a() {
    var i = 0;
    function b() {
    alert(++i);
    }
    return b;
    }
    var c = a();
    c();
    c();

    此时我个人认为var c=a();与var c=new a();  是完全相同的,所返回的c都是一个b的构造函数,当然c不是对象,单纯的方法,但作为理解已经够用了

    故此时a()为构造一个方法  ,里面的b()为构造这个方法的方法,换句话说java中的方法依赖于对象,js的方法是可以独立的,一切好像都明朗了,必包就是构造方法的构造函数的一种形式

    途中c()对方法的执行都会使用构造方法的方法中的常量i...答案就这么简单

    function f(x) {
    var g = function () { return x; }
    return g;
    }
    var h = f(1);
    alert(h());

    name在看到上面这个必包的时候,就可以解释为,js中构造方法的方法是可以带参数的,具体答案就是1..

    所以可以这么总结,基于原型的面向对象js,不依赖于对象(或者说整个js运行的环境就在一个对象中,故感觉方法不依赖对象),具有面向对象的创建对象的方式,也有自己独有的面向对象的创建方法的方式--必包,至于必包的作用,解析型语言,解析到哪是哪,难以用类区分个个对象体,增加必包的概念以弥补不能分类创建的不足,不以对象为依赖等等,稍微想下也能明白,自由发挥,至于原理度娘吧

    回调:写在脸上的东西脸上的东西最不好解释,类似于策略模式,留一个你会运行却不知道具体代码的接口,也可以解释为AOP

    function a(success,failed) 
    {    
    //return b;
    b=ture;
    if(b)
        success();
    else
    failed(); 
    } 
    function success(){ 
    alert("搞定"); 
    } 
    function failed(){ 
    alert("错了"); 
    } 
    a(success,failed);

    眼熟吧,所以猜猜监听器,事件为何在js对象外部写,内部调用?

    所以,个人认为js回调与java的接口回调都是基于本身语言特点对回调函数的具体实现方式

    作用域:无论怎么回避,最终还是要理解的概念,既然前面已经认为js本身就是一个巨大的对象,认为js存在一种创建方法的方法,那其中的this...究竟是什么呢?

    增删改查,编程的衣食住行,最基本的要求,对js的增删改在怎么烂的底子度娘一下还是能完成的,但是查...却成了心中永远的痛byName,this...多少次徘徊在我存在的数据究竟在哪的困惑中....

    写作规范:好的规范,你知道的...,依照面向对象的特点,写ext大致就是定义对象,创建对象,拼接对象这么个过程。。待续

  • 相关阅读:
    008Spring & JPA & Hibernate & MySQL
    007Spring Security
    006Spring面向切面
    005运行时值注入
    004bean作用域
    003自动装配歧义性解决
    002Conditional条件化创建bean
    001profile条件化创建bean
    007API网关服务Zuul
    Sqlserver2008R2 如何使用bak备份文件还原数据库以及对应的失败解决方案
  • 原文地址:https://www.cnblogs.com/liuCy/p/3300247.html
Copyright © 2011-2022 走看看