JavaScript省市区三级联动菜单效果,JavaScript中原型链存在的问题解析

注意

我们知道使用原型链实现继承是一个goodway:)看个原型链继承的例子。

本文实例为大家分享了三级联动省市区js完整代码,供大家参考,具体内容如下

本文中获取与修改的URL以
‘’ 这个路径为例:

function A () {
this.abc = 44;
}
A.prototype.getAbc = function (){
return this.abc;
};
function B() {
}
B.prototype = new A(); // B通过A的实例完成了继承,形成了原型链(B的原型就是A的实例)
var b = new B();
b.getAbc(); 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
 var cityList = new Array();
 var quList = new Array();
 cityList['北京'] = [ '北京' ];
 cityList['浙江'] = [ '杭州市', '温州市', '金华市', '临安市' ];
 cityList['陕西'] = [ '西安', '宝鸡', '咸阳' ];
 cityList['甘肃'] = [ '兰州市', '武威市', '酒泉市', '张掖市' ];

quList['北京'] = [ '1区', '2区', '3区', '4区' ];
 quList['杭州市'] = [ '5区', '6区', '7区', '8区' ];
 quList['温州市'] = [ '9区', '10区', '11区', '12区' ];
 quList['西安'] = [ '13区', '14区', '15区', '16区' ];
 quList['宝鸡'] = [ '17区', '18区', '19区', '20区' ];
 quList['兰州市'] = [ '21区', '22区', '23区', '24区' ];

window.onload = allData;
 function allData() {
 var shengfen = document.getElementById('shengfen');
 for ( var sf in cityList) {
 shengfen.add(new Option(sf, sf));
 }

}
 function changeCity() {

var chengshi = document.getElementById('chengshi');
 var sheng = document.getElementById('shengfen').value;

chengshi.options.length = 1;
 for ( var cs in cityList[sheng]) {
 chengshi.add(new Option(cityList[sheng][cs], cityList[sheng][cs]));

}
 }

function changequ() {
 var shiqu = document.getElementById('shiqu');
 var cheng = document.getElementById('chengshi').value;
 shiqu.options.length = 1;
 for ( var sh in quList[cheng]) {

shiqu.add(new Option(quList[cheng][sh], quList[cheng][sh]));

}

}
</script>
</head>
<body>
 <br />

<select id="shengfen" style="width:100px" onchange="changeCity()"><option>--选择省份--</option>

</select>
 <select id="chengshi" style="width:100px" onchange="changequ()"><option>--选择城市--</option>

</select>
 <select id="shiqu" style="width:100px"><option>--选择区县--</option>

</select>

</body>
</html>

一.
获取url的相关方法(不修改URL):

关系如下:b(实例) ->B.prototype = new A() -> A.prototype
->Object.prototype

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

1.获取当前完整的url路径  

可是在这种看似“漂亮”的继承方法中确存在问题。

您可能感兴趣的文章:

  • vue.js模仿京东省市区三级联动的选择组件实例代码
  • js
    实现省市区三级联动菜单效果
  • JSON+Jquery省市区三级联动
  • javascript省市区三级联动下拉框菜单实例演示
  • javascript实现省市区三级联动下拉框菜单
  • 省市区三级联动下拉框菜单javascript版
  • javascript实现简单的省市区三级联动
  • PHP+Mysql+Ajax+JS实现省市区三级联动
  • 从QQ网站中提取的纯JS省市区三级联动菜单
  • js实现一个省市区三级联动选择框代码分享
  • 原生js实现省市区三级联动代码分享
var absurl = $location.absUrl(); 
//http://172.16.0.88:8100/#/homePage?id=10&a=100 

1.
最主要的问题来自包含引用类型值的原型,我们知道共享原型是存在问题的,抛出一个例子

  1. 获取当前url路径(当前url#后面的内容,包括参数和哈希值):  
function Person () { 
}
Person.prototype = {
friends = ["a","b"]; 
}
var person1 = new Person();
var person2 = new Person();
person1.friends.push("c");
console.log(person1.friends); // "a","b","c"
console.log(person2.friends); //"a","b","c" 
 var url = $location.url(); 
 // 结果:/homePage?id=10&a=100 

通过引用实例改变了原型中本来中的值,同时也影响了其他实例。(这就是为什么引用类型值要定义在构造函数中而非原型中的原因)

  1. 获取当前url的子路径(也就是当前url#后面的内容,不包括参数) 

在原型链中同样也会有同样的情况出现:

var pathUrl = $location.path() 
//结果:/homePage 
function A () {
this.numbers = [1,2,3];
}
function B() {
}
B.prototype = new A();
var b = new B();
var a = new A();
b.numbers.push(4); 
b.numbers; //1234
var b2 = new B(); 
b2.numbers; //1234
a.numbers; //123 

4.获取当前url的协议(比如http,https) 

我们看到出现了和上面一样的情况(在通过原型来继承时,原型实际上会变成另一个类型的实例。于是原先的实例属性也就顺理成章的变成了现在原型属性了)。

var protocol = $location.protocol(); 
//结果:http 

可是我们看到A的实例a.numbers;依然是123,说明在B继承A的实例时是复制了A实例中的所有属性(包括prototype指针,形成原型链)并非引用(其实这里有疑问,是因为继承的是A()的实例所以才不会影响A()创建其他实例的表现吗?)。

5.获取主机名 

2.在创建子类实例时,不可以在不影响所有对象实例的情况下给超类传递参数。

发表评论

电子邮件地址不会被公开。 必填项已用*标注