js19--继承终极版本

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Untitled Document</title>
        <script type=text/javascript charset=utf-8>
        function extend(Child ,Parent){
             var F = new Function();//创建一个函数F,跟写 function F(){};一样
             F.prototype = Parent.prototype;
             Child.prototype = new F();
             Child.prototype.constructor = Child ;

             //保存一下父类的原型对象: 一方面方便解耦  另一方面方便获得父类的原型对象
             Child.superClass = Parent.prototype; //自定义一个子类的静态属性 保存父类的原型对象,写 Child.superClass = Parent也可以。保证子类中可以找到父类。
             alert(Parent.prototype.constructor);
             alert(Parent);
             /*function Person( name , age){
                this.name = name ;
                this.age = age ;
            }*/
             alert(Parent.prototype.constructor ===  Parent);//true
             //判断父类的原型对象的构造器 (加保险),Person.prototype = {中不写constructor: Person ,那么Parent.prototype.constructor就是Object
             if(Parent.prototype.constructor == Object.prototype.constructor){
                Parent.prototype.constructor = Parent ; //容错性,就是写出你不知道的情形。
             }
        }

        function Person( name , age){
            this.name = name ;
            this.age = age ;
        }

        Person.prototype = {
            sayHello: function(){
                alert(‘hello world!‘);
            }
        };
        Object.defineProperty(Person.prototype , ‘constructor‘ , {
             enumerable : false ,
             value : Person
        });
        Person.prototype.say = function(){
            alert(‘hello world!‘);
        }

        function Boy(name , age , sex){
            //call,子类就可以直接new Boy(传3个参数),否则只能通过父类实例对象来访问添加的属性。
            //Person.call(this,name,age); Boy.superClass.constructor=Person,解耦,子类中不写父类的东西。
            Boy.superClass.constructor.call(this , name , age);
            this.sex = sex ;
        }
        extend(Boy , Person);
        Boy.prototype.sayHello = function(){//覆盖父类的方法
            alert(‘hi javascript!‘);
        }

        var b = new Boy(‘张三‘ , 20 , ‘男‘);
        alert(b.name); //张三
        alert(b.sex);//男
        b.sayHello();//hi javascript!
        //调用父类方法
        Boy.superClass.sayHello.call(b);//hello world!
        b.__proto__.__proto__.sayHello();//hello world!
        b.constructor.prototype.__proto__.sayHello()//hello world!
        alert(Boy.superClass.constructor);
        /*function Person( name , age){
            this.name = name ;
            this.age = age ;
        }*/
        </script>
    </head>
    <body>
    </body>
</html>
第一,子类调用call方法。
第二,子类原型对象的构造函数要改变,原型对象和自己对象的构造器指向函数本身(函数本身的prorotype和对象的__proto__指向原型对象)。
第三,子类增加一个静态属性指向父类的原型对象,办证子类可以找到父类。
第四,子类原型对象新增属性要写在creat之后,因为creat之后子类才有了原型对象。

function F(){
    this.name = "yw";
    var age = 32;
    sch = 890;
}    

var f = new F();
alert(f.name);//yw
alert(f.age);//undefined
alert(f.sch);//undefined
alert(window.name);//空
F();
alert(window.name);//yw

var F = new Function();//创建一个函数F,跟写 function F(){};一样

//可以直接写constructor,prototype,不能写__proto__,_proto__是为了表示对象是怎么找到类的原型对象的属性方法的。

时间: 2024-10-09 04:07:12

js19--继承终极版本的相关文章

session之cookie封装终极版本

class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): pass def __getitem__(self, item): print(item) pass def __setitem__(self, key, value): print(key,value) pass def __delitem__(self, key): pass # 调用__int__方法 Foo() # 调用__call__方法 o

HighCharts终极版本

<script type="text/javascript"> var legendDate=""; var series=""; var ser=""; var legend=""; var option={}; function opSeries(){ option ={ title: { text: '性能数据采集到入库关键节点处理效率报表' }, xAxis: { categories:

for循环终极版本练习提高 究极进化版

X3 * 6528 = 3X * 8256, X为一个数字 填入一个数字 使等式成立. for (var x = 1; x>0&&x<9; x++) { if ((x*10+3)*6528 == (3*10+x)* 8256) { break; } } alert(x); 在页面上输出以下图形               *             ***           *****         *******       ********* 说道这个题就有点头疼了,首

30 装饰器终极版本(进阶)

import timeFLAGE = Falsedef timmer_out(flag): def timmer(func): def inner(*args,**kwargs): if flag: start = time.time() ret = func(*args,**kwargs) end = time.time() print(end-start) return ret else: ret = func(*args, **kwargs) return ret return inner

轻松搭建自己的Linux发行版本

许多人想要搭建自己的Linux发行版本,可能是觉得有趣,也可能是为了学习更多的Linux知识,或者因为他们有很正式的问题要解决.但是秘密是:自己搭建完美的发行版本不是很困难的一件事.事实上,我们收集了几种方法,使用这些方法,每个人,是的,甚至是你——都可以搭建满足自己需要的个性化的Linux版本,只要应用一些你想要的改变——那就是你的Linux,你的风格. 主流的Linux发行版本开发者们不得不做出影响成千上万潜在使用者的决定.他们到底是应该添加还是删除一个特殊的软件包?他们是否应该应用一个可能

C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员是派生类成员一样: Bulk_item bulk; cout << bulk.book() << endl; 名字book的使用将这样确定[先派生->后基类]: 1)bulk是Bulk_item类对象,在Bulk_item类中查找,找不到名

C++ Primer 学习笔记_69_面向对象编程 -继承景况下的类作用域

面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员是派生类成员一样: Bulk_item bulk; cout << bulk.book() << endl; 名字book的使用将这样确定[先派生->后基类]: 1)bulk是Bulk_item类对象,在Bulk_item类中查找,找不到名

阿里正式发布《Java开发手册》终极版!

摘要: 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质量的美.而代码规约其实就是一个对美的定义. 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质量的美.而代码规约其实就是一个对美的定义. <阿里巴巴Java开发手

有关HTML版本

先说说HTML的简史:从HTML1.0~2.0(1989~1991)>HTML3(1995)>HTML4(1998)>HTML4.01(1999)>XHTML1.0(2001)>HTML5(终极版本). HTML规范一直在变,随着浏览器的需求,迫使HTML不得不更新换代.到HTML4时出现的World Wide Web Consortium(万维网协会W3C),一个致力于创建一个唯一的HTML"标准"的组织.他们将html的结构和表现分解到两种语言,一种语